apache-spark - 如何在 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<string,string>]
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?
解决方案
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()
打印相同的结果。
推荐阅读
- python - 尝试在 ubuntu 服务器上运行我的机器人时不断收到 ModuleNotFoundError: No module named 'lib.cogs' 错误
- javascript - 在 Array Javascript 中查找双元音
- angular - NativeScript flexbox布局
- javascript - Google Places API 仅返回 1 个结果
- reactjs - 在 React.js onClick 中切换一个元素
- sql-server - 如何编写此 SQL 代码并在同一张表上输出?
- amazon-web-services - AWS 访问密钥的自动轮换
- tensorflow - 在张量流中的神经网络中添加层时出错
- firebase - 使用@gmail.com 帐户在firebase 中的假用户
- python - 浮点错误/如何在python中截断两位小数