Spark SQL 命令不适用于双精度



这返回数据:

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")

最新更新