pyspark 如何groupby然后在多个列上聚合

rn0zuynd  于 2023-10-15  发布在  Spark
关注(0)|答案(1)|浏览(111)

我在Spark上使用Pandas。我需要按A和B分组,然后聚合以返回一个map列表,其中键是C,值是D Sample输入:

A      B        C           D
0        7 201806851 0006378110  2223982011
1        7  6378110 0006378110  2223982011
2        7 201806851  201806851  20972475011
3        7  6378110  201806851  20972475011

样品输出:

A      B        C
0        7  6378110 [[0006378110, 2223982011], [201806851, 20972475011]]
1        7 201806851 [[0006378110, 2223982011], [201806851, 20972475011]]

这是我的代码。它在第一行给出了错误assert len(key) == len(that_column_labels) AssertionError。有什么想法吗?

seed_data["C"] = seed_data[["C", "D"]].to_dict('records')
seed_data = (seed_data
                     .groupby(["A", "B"])["C"]
                     .apply(list).reset_index(name="C"))

尝试了一些事情,比如将列C和D提取到一个单独的嵌套框架中,转换为dict,然后将其用作聚合列。但得到Assert错误。

oymdgrw7

oymdgrw71#

可以使用本机spark函数以有效的方式完成此操作。在pyspark中,您需要对框架进行分组,然后收集c -> D对的列表

df.groupBy('A', 'B').agg(F.collect_list(F.create_map('C', 'D')).alias('CD'))
+---+---------+--------------------------------------------------------+
|A  |B        |CD                                                      |
+---+---------+--------------------------------------------------------+
|7  |201806851|[{0006378110 -> 2223982011}, {201806851 -> 20972475011}]|
|7  |6378110  |[{0006378110 -> 2223982011}, {201806851 -> 20972475011}]|
+---+---------+--------------------------------------------------------+

相关问题