如何在 spark-sql 查询中引用地图列?

Posted

技术标签:

【中文标题】如何在 spark-sql 查询中引用地图列?【英文标题】:How to refer a map column in a spark-sql query? 【发布时间】:2020-09-28 17:50:02 【问题描述】:
scala> val map1 = spark.sql("select map('p1', 's1', 'p2', 's2')")

map1: org.apache.spark.sql.DataFrame = [map(p1, s1, p2, s2): map]

scala> map1.show()

+--------------------+
| map(p1, s1, p2, s2)|
+--------------------+
|[p1 -> s1, p2 -> s2]|
+--------------------+
scala> spark.sql("select element_at(map1, 'p1')")

org.apache.spark.sql.AnalysisException:无法解析'map1'给定 输入列:[];第 1 行,第 18 行; '项目 [unresolvedalias('element_at('map1, p1), None)]

我们如何在第二个 sql 查询中重用数据框 map1?

【问题讨论】:

element_at 接受 column 参数。你正在向它传递一个数据框。 【参考方案1】:

map1 是具有单列类型 map 的数据框。此列的名称为 map(p1, s1, p2, s2)。例如可以使用selectExpr 查询数据帧:

map1.selectExpr("element_at(`map(p1, s1, p2, s2)`, 'p1')").show()

打印

+-----------------------------------+
|element_at(map(p1, s1, p2, s2), p1)|
+-----------------------------------+
|                                 s1|
+-----------------------------------+

另一种选择是将数据框注册为临时视图,然后使用 sql 查询:

map1.createOrReplaceTempView("map1")
spark.sql("select element_at(`map(p1, s1, p2, s2)`, 'p1') from map1").show()

打印相同的结果。

【讨论】:

以上是关于如何在 spark-sql 查询中引用地图列?的主要内容,如果未能解决你的问题,请参考以下文章

带有条件的 Grails 查询:如何取回带有列的地图?

如何在同一查询的另一列中引用聚合列?

如何从地图列表中逐列检索飞镖中的数据?

如何查询经纬度坐标

如何对sql查询引用组中的多列求和

如何根据其他列在火花中添加地图列?