Spark Shell:当数据为整数/双精度时,SQL 查询不返回任何结果

Posted

技术标签:

【中文标题】Spark Shell:当数据为整数/双精度时,SQL 查询不返回任何结果【英文标题】:Spark Shell: SQL Query doesn't return any results when data is integer/double 【发布时间】:2022-01-19 20:33:50 【问题描述】:

我正在使用 MongoDB Spark 连接器从 MongoDB 导入数据,然后执行一些 SQL 查询。我将在进入实际问题之前描述整个过程,以防我做错了什么,因为这是我第一次使用这些工具。

我用特定的 Collection 初始化 spark-shell,包括连接器包:

spark-shell --conf "spark.mongodb.input.uri=mongodb://127.0.0.1/myDb.myBigCollection"      
 --packages org.mongodb.spark:mongo-spark-connector_2.12:3.0.1

我启用了连接器:

import com.mongodb.spark._

我对我想要的集合做了一个 RDD:

val rdd = MongoSpark.load(sc)

我用它制作了一个 Dataframe,这样我就可以在上面使用 SQL:

val df = rdd.toDF()

我创建了一个数据集的临时视图:

df.createOrReplaceTempView("sales")

数据库有 100 万条这种格式的条目:

_id: 61a6540c3838fe02b81e5339
Region: "Sub-Saharan Africa"
Country: "Ghana"
Item Type: "Office Supplies"
Sales Channel: "Online"
Order Priority: "L"
Order Date: 2017-03-22T22:00:00.000+00:00
Order ID: 601245963
Ship Date: 2017-04-14T21:00:00.000+00:00
Units Sold: 896
Unit Price: 651.21
Unit Cost: 524.96
Total Revenue: 583484.16
Total Cost: 470364.16
Total Profit: 113120

数据类型为字符串/日期/数字/双精度。

这样的简单查询就可以正常工作:

spark.sql("SELECT * FROM sales").show()

字符串查询也可以正常工作:

spark.sql("SELECT Country FROM sales WHERE Region = 'Sub-Saharan Africa'").show()

但是当我对数值进行查询时,我得到一个空表:

spark.sql("SELECT * FROM sales WHERE 'Units Sold' > 4000").show()

我尝试将查询分配给一个 val,然后在其上使用 show(),但它是同一件事。

【问题讨论】:

【参考方案1】:

如果不是 SELECT 中的拼写错误/剪切粘贴错误,则其中的 WHERE 子句会将字符串“已售出的商品”与数值 4000 进行比较,而这绝不是真的。在 SparkSQL 中转义列名的正确方法是使用 `(反引号)而不是 '(撇号)。

所以使用下面的查询

spark.sql('SELECT * FROM sales WHERE `Unit Sold` > 1').show()

【讨论】:

以上是关于Spark Shell:当数据为整数/双精度时,SQL 查询不返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章

基本 Java:判断双精度数是不是为整数的方法

舍入双精度值并转换为整数

比较一个 32 位浮点数和一个 32 位整数而不强制转换为双精度,当任何一个值都可能太大而无法完全适合另一种类型时

BigInteger大精度整数

将精确的音频位置存储为双精度秒是不是安全?

单精度小数点后面有几位?