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