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("<temp view name">)
。然后你从那个临时视图中选择。
你必须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.show
和 df1.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(scala 或 java)中的嵌套 json
forEach Spark Scala 中的错误:值选择不是 org.apache.spark.sql.Row 的成员
intellij 中 spark scala 应用程序中的线程“main”java.lang.NoClassDefFoundError:org/apache/spark/sql/catalyst/St