我有这样一个Dataframe:
df = spark.createDataFrame([
Row(foo='a', bar=1, baz=4),
Row(foo='a', bar=2, baz=5),
Row(foo='b', bar=3, baz=6),
])
上述结果如下:
[Row(bar=1, baz=4, foo='a'), Row(bar=2, baz=5, foo='a'), Row(bar=3, baz=6, foo='b')]
我需要分组讨论 foo
然后把其他的都列成单子。结果需要与派生它们的列保持相同的名称。
到目前为止,我得到了这个:
df.groupBy('foo').agg(
F.arrays_zip(
F.collect_list(F.col('bar')),
F.collect_list(F.col('baz')),
).alias('events')
)
输出返回一个Dataframe,其中 events
列包含行,每个行都有递增的键 0
, 1
, 2
等等。
[Row(foo='a', events=[Row(0=1, 1=4), Row(0=2, 1=5)]), Row(foo='b', events=[Row(0=3, 1=6)])]
我想保留原来的列名作为键。例如 Row(0=1, 1=4)
而是 Row(bar=1, baz=4)
. 如何做到这一点?
2条答案
按热度按时间wvt8vs2t1#
您可以简单地收集结构列表,而不是创建2个数组列并压缩它们:
d5vmydt92#
解决方案是将其分为两个步骤:
结果是: