如何在 spark-sql 查询中引用映射列?
How to refer a map column in a spark-sql query?
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: cannot resolve 'map1
' given
input columns: []; line 1 pos 18; 'Project
[unresolvedalias('element_at('map1, p1), None)]
我们如何在第二个 sql 查询中重用数据帧 map1?
map1
是一个具有单列地图类型的数据框。此列的名称为 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()
打印相同的结果。
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: cannot resolve '
map1
' given input columns: []; line 1 pos 18; 'Project [unresolvedalias('element_at('map1, p1), None)]
我们如何在第二个 sql 查询中重用数据帧 map1?
map1
是一个具有单列地图类型的数据框。此列的名称为 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()
打印相同的结果。