这返回数据:
var cleanDF = readingsDF.filter(readingsDF("STR") > -1)
这将不返回任何数据:
var cleanDF = spark.sql("select * from readingsDF where STR > -1")
这两个语句应该是等效的。
下面是架构:
readingsDF.printSchema()
root
|-- STR: double (nullable = true)
|-- OBS: double (nullable = true)
|-- AGMT: double (nullable = true)
|-- FNDX: double (nullable = true)
|-- HIGD: double (nullable = true)
|-- DEG: double (nullable = true)
|-- CHK: double (nullable = true)
|-- AGP1: double (nullable = true)
|-- AGMN: double (nullable = true)
|-- NLV: double (nullable = true)
|-- LIV: double (nullable = true)
|-- WT: double (nullable = true)
|-- AGLP: double (nullable = true)
|-- MST: double (nullable = true)
在执行SQL
查询之前注册临时table
readingsDF.registerTempTable("readingsDF") //for older version
readingsDF.createOrReplaceTempView("readingsDF")
比执行SQL
查询
var cleanDF = spark.sql("select * from readingsDF where STR > -1")
TL;DR 这两个语句可以是等效的,但不是一般的。
这两个名称位于不同的范围内,可能引用相同的数据集,但也可能不引用。
val readingsDF
后面的readingsDF
是 Scala 中的一个值。我想这是一个DataFrame
.它可以指向 CSV 文件中的数据集,如下所示:
val readingsDF = spark.read.csv("dataset.csv")
select * from readingsDF where STR > -1
中的readingsDF
是在 Spark SQL 应用程序的关系实体目录中注册的表或视图。它可以是任何东西(包括上面的 Scala 值,但不必如此(。
代码中可以包含以下内容:
readingsDF.createOrReplaceTempView("readingsDF")
只有这样,你才能说这两个readingsDF
指向同一个数据集。
你也可以有如下的东西,它们不会指向同一个数据集。
spark.range(5).createOrReplaceTempView("readingsDF")
另一种选择是调用 Dataset.createGlobalTempView
方法,此解决方案与@Shankar解决方案之间的区别如下:
Dataset.createGlobalTempView
的文件说:
使用给定名称创建全局临时视图。此临时视图的生存期与此 Spark 应用程序相关联。
全局临时视图是跨会话的。它的生存期是 Spark 应用程序的生存期,即当应用程序终止时,它将自动删除。它与系统保留的数据库_global_temp相关联,我们必须使用限定名称来引用全局临时视图,例如 SELECT * FROM _global_temp.view1。
而不是Dataset.createOrReplaceTempView
方法:
使用给定名称创建本地临时视图。此临时视图的生存期与用于创建此数据集的 SparkSession 相关联。
所以解决方案将是这样的:
readingsDF.createGlobalTempView("readingsDF")
var cleanDF = spark.sql("select * from _global_temp.readingsDF where STR > -1")