Spark SQL命令不使用双精度程序

时间:2017-05-20 15:31:46

标签: scala apache-spark apache-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)

3 个答案:

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