返回数据:
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)
答案 0 :(得分:1)
在执行table
查询
SQL
readingsDF.registerTempTable("readingsDF") //for older version
readingsDF.createOrReplaceTempView("readingsDF")
执行SQL
次查询
var cleanDF = spark.sql("select * from readingsDF where STR > -1")
答案 1 :(得分:1)
TL; DR 两个语句可能相同,但一般 。
这两个名称在不同的范围内,可能引用相同的数据集,但也可能不是。
readingsDF
之后的 val readingsDF
是Scala中的值。我猜测它是DataFrame
。它可以指向CSV文件中的数据集,如下所示:
val readingsDF = spark.read.csv("dataset.csv")
readingsDF
中的 select * from readingsDF where STR > -1
是在Spark SQL应用程序中的关系实体目录中注册的表或视图。它可以是任何东西(包括上面的Scala值,但不必)。
您的代码中可以包含以下内容:
readingsDF.createOrReplaceTempView("readingsDF")
只有这样你就可以说两个readingsDF
指向同一个数据集。
您还可以拥有如下内容,但它们不会指向相同的数据集。
spark.range(5).createOrReplaceTempView("readingsDF")
答案 2 :(得分:0)
另一种选择是调用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")