小编Mak*_*tin的帖子

如何在pyspark中将2列聚合到地图中

我有一个像这样的数据框

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)

python pyspark

5
推荐指数
1
解决办法
1853
查看次数

如何在 pyspark 中按列名称映射值

我想要什么 - 是将列名映射到键中。例如:

#+-------+----------+
#|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 但我认为这不是最好的解决方案/

python dataframe apache-spark apache-spark-sql pyspark

1
推荐指数
1
解决办法
2436
查看次数