我有一个像这样的数据框
a = spark.createDataFrame([['Alice', '2020-03-03', '1'], ['Bob', '2020-03-03', '1'], ['Bob', '2020-03-05', '2']], ['name', 'dt', 'hits'])
a.show()
+-----+----------+----+
| name| dt|hits|
+-----+----------+----+
|Alice|2020-03-03| 1|
| Bob|2020-03-03| 1|
| Bob|2020-03-05| 2|
+-----+----------+----+
Run Code Online (Sandbox Code Playgroud)
我想聚合 dt 并将列点击到地图中 -
+-----+------------------------------------+
| name| map |
+-----+------------------------------------+
|Alice| {'2020-03-03': 1, '2020-03-05':2}|
| Bob| {'2020-03-03': 1} |
+-----+------------------------------------+
Run Code Online (Sandbox Code Playgroud)
但这段代码抛出异常:
from pyspark.sql import functions as F
a = a.groupBy(F.col('name')).agg(F.create_map(F.col('dt'), F.col('hits')))
Py4JJavaError: An error occurred while calling o2920.agg.
: org.apache.spark.sql.AnalysisException: expression '`dt`' is neither present in the group by, nor …Run Code Online (Sandbox Code Playgroud) 我想要什么 - 是将列名映射到键中。例如:
#+-------+----------+
#|key1 |key2 |
#+-------+----------+
#|value1 |value2 |
#|value3 |value4 |
#+-------+----------+
Run Code Online (Sandbox Code Playgroud)
将转变为
#+-------+----------+
#| keys|values |
#+-------+----------+
#|key1 |value1 |
#|key1 |value2 |
#|key2 |value3 |
#|key2 |value4 |
#+-------+----------+
Run Code Online (Sandbox Code Playgroud)
在 HiveQL 中我可以写类似的东西
select distinct key, velue
from xxx
lateral view explode(map(
'key1', key1,
'key2', key2) tab as key, value
Run Code Online (Sandbox Code Playgroud)
但是在pyspark上怎么写呢?我可以使用 createtemptable 但我认为这不是最好的解决方案/