Spark/scala 中的 SQL 查询

Posted

技术标签:

【中文标题】Spark/scala 中的 SQL 查询【英文标题】:SQL queries in Spark/scala 【发布时间】:2019-09-18 14:46:50 【问题描述】:

我是 Spark/scala 的新手,我正在尝试将 CSV 文件导入 Spark,并分析其中的数据。 CSV 文件有 5 列(passengerid、flightid、from、to、date)。我已经成功上传了 csv 文件,但是当我去对它执行查询时,比如说要找出每月的总航班数,我不断收到错误 - 特别是线程“主”org.apache.spark.sql.AnalysisException 中的异常:未找到表或视图:df1;第 1 行 pos 14'。该表已成功上传,因为我可以将其视为输出,问题在于查询表。有什么想法吗?

我的代码如下:

''' 包 GerardPRactice

import org.apache.spark.SparkContext

import org.apache.spark.SparkContext._

import org.apache.spark.SparkConf

import org.apache.spark.sql.SparkSession

import org.apache.spark.sql.SQLContext


object trial1 extends App 

  val sparkConf = new SparkConf().setAppName("trial1").
setMaster("local[2]") //set spark configuration

val sparkContext = new SparkContext(sparkConf) // make spark context
val sqlContext = new SQLContext(sparkContext) // make sql context

  val spark = SparkSession
    .builder()
    .master("local")
    .appName("Question1")
    .getOrCreate()



val df1 = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true")
    .option("delimiter", "|")
    .option("inferSchema", "true")
    .load("C:/Users/Gerard/Documents/flightData.csv")
   // df1: org.apache.spark.sql.DataFrame = [passengerID: int, flightID: int, Departure: string, Destination: string, date: int]

    val df2 = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true")
    .option("delimiter", "|")
    .option("inferSchema", "true")
    .load("C:/Users/Gerard/Documents/passengers.csv")

  df1.show()
  //val PassID = df1.select("passengerId")
  val totalflightJAN = spark.sql("SELECT * FROM df1 WHERE date>= '2017-01-01' & date<='2017-01-31'")
  totalflightJAN.collect.foreach(println)
'''

【问题讨论】:

要像这样使用 spark sql,您需要从数据框创建一个视图 - df1.createOrReplaceTempView("&lt;temp view name"&gt;)。然后你从那个临时视图中选择。 你必须df1.createOrReplaceTempView(viewName = "df1")。如果表不存在,您希望查询如何工作,您有一个 DataFrame 它是运行时数据结构,而不是配置单元表。你读过documentation吗? 感谢您的帮助,成功了。但是,我仍在运行未注册的查询。 IE。我对(列)flightID ' val totalflightJAN = spark.sql("SELECT * FROM df1 where to='cg'") 运行查询,但它返回错误'无法解析'from'给定输入列:[df1 .passengerId,flightId,from,to,date];' 【参考方案1】:

帮自己一个忙,改用 DataFrame 语法而不是纯 SQL! :)

假设 df1.showdf1.printSchema 成功(另外,请仔细查看您的 date 数据类型),您可以尝试以下操作:

df1.filter($"date" >= lit('2017-01-01') && $"date" <= lit('2017-01-31'))

您可能必须用to_date($"date", "yyyy/MM/dd")(或其他格式)包装“日期”

【讨论】:

谢谢我用过这个,它已经部分工作了。我希望使用这种类型的语法来找出每个月的总数。我正在尝试使用 count 功能,但不确定该放在哪里。 你可能想看看.groupBy(...).count patterns 如果它解决了您原来的问题,请考虑接受答案。

以上是关于Spark/scala 中的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

spark-sql/Scala 中的反透视列名是数字

我如何将平面数据框转换为 spark(scala 或 java)中的嵌套 json

forEach Spark Scala 中的错误:值选择不是 org.apache.spark.sql.Row 的成员

intellij 中 spark scala 应用程序中的线程“main”java.lang.NoClassDefFoundError:org/apache/spark/sql/catalyst/St

如何在 Spark Scala SQL 查询中包含 0 值?

Spark SCALA - 连接两个数据帧,其中一个数据帧中的连接值位于第二个数据帧中的两个字段之间