Spark Shell:SQL 当数据为 integer/double 时,查询 return 没有任何结果

Spark Shell: SQL Query doesn't return any results when data is integer/double

我正在使用 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

数据类型是string/date/number/double。

像这样的简单查询就可以了:

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

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

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

但是当我查询数值时,我得到一个空的 table:

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

我试过将查询分配给一个 val,然后在其上使用 show() 但这是一回事。

如果您的 SELECT 中不是 typo/cut-n-paste 错误,其中的 WHERE 子句会将字符串“Units Sold”与数值 4000 进行比较,这永远不会为真。在 SparkSQL 中转义列名的正确方法是使用 `(反引号)而不是 '(撇号)。

所以使用下面的查询

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