【问题标题】:Spark SQL command not working with doublesSpark SQL命令不适用于双打
【发布时间】:2017-10-20 15:01:13
【问题描述】:

这会返回数据:

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查询没有?
  • 当你说“Spark SQL 命令不能使用双精度”时,错误是什么?
  • 现在我运行了它并且它工作了:val cleanDF = spark.sql("select * from readingsDF where STR > -1")。所以这个问题应该被关闭,因为我一定遗漏了一些东西。 (但如果我这样做的话,应该会有一些错误。)

标签: scala apache-spark apache-spark-sql


【解决方案1】:

在执行SQL 查询之前注册一个临时的table

readingsDF.registerTempTable("readingsDF") //for older version

readingsDF.createOrReplaceTempView("readingsDF")

比执行SQL 查询

var cleanDF = spark.sql("select * from readingsDF where STR > -1")

【讨论】:

    【解决方案2】:

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

    只有这样你才能说这两个readingsDFs 指向同一个数据集。

    你也可以有如下的东西,它们不会指向同一个数据集。

    spark.range(5).createOrReplaceTempView("readingsDF")
    

    【讨论】:

      【解决方案3】:

      另一种选择是调用Dataset.createGlobalTempView 方法,此解决方案与@Shankar 的解决方案的区别如下:

      Dataset.createGlobalTempView 的文档说:

      使用给定名称创建一个全局临时视图。此临时视图的生命周期与此 Spark 应用程序相关联。

      全局临时视图是跨会话的。它的生命周期是 Spark 应用程序的生命周期,即当应用程序终止时它会被自动删除。它与系统保留的数据库 _global_temp 相关联,我们必须使用限定名称来引用全局临时视图,例如选择 * FROM _global_temp.view1。

      而不是Dataset.createOrReplaceTempView 方法:

      使用给定名称创建本地临时视图。此临时视图的生命周期与用于创建此数据集的 SparkSession 相关联。

      所以解决方案是这样的:

      readingsDF.createGlobalTempView("readingsDF")
      var cleanDF = spark.sql("select * from _global_temp.readingsDF where STR > -1")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 2011-03-28
        相关资源
        最近更新 更多