PySpark 将多个列映射到包含所有值的 1 个"dict"列,而无需使用 df.collect()



我目前有多个列(至少500)在我的DataFrame以以下任何前缀['a_', 'b_', 'c_']开始。

我想有一个只有3列的DataFrame

#  +++++++++++++++++++++
#    a  |  b  |  c  |
#  +++++++++++++++++++++
#  {'a_1': 'a_1_value', 'a_2': 'a_2_value'} | {} | {'c_1': 'c_1_value', 'c_2': 'c_2_value'}|

调用df.collect()会导致我正在使用的框架中的StackOverflowErrors,因为DataFrame非常大。我试图利用映射函数来避免在驱动程序中加载DataFrame(因此约束)

像这样?

使用struct将任意具有一定前缀的列组合为1列,然后使用to_jsonstruct形成键值对形状。

cols = ['a', 'b', 'c']
df.select([
F.to_json(F.struct(*[x for x in df.columns if x.startswith(f'{col}_')])).alias(col)
for col in cols]
) 

最新更新