如何在Spark-SQL查询中引用映射列?

问题描述

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行pos 18; '项目 [unresolvedalias('element_at('map1,p1),None)]

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

解决方法

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

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

打印

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

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

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

打印相同的结果。