PySpark 在不使用 df.collect() 的情况下将多列映射到包含所有值的 1 'dict' 列

PySpark map multiple columns to 1 'dict' column containing all values without using df.collect()

我目前在我的 DataFrame 中有多个列(至少 500 个)以以下任何前缀开头 ['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() 会导致我正在使用的框架出现 WhosebugErrors,因为 DataFrame 非常大。我正在尝试利用映射函数来避免在驱动程序中加载 DataFrame(因此存在约束)

是这样的吗?

使用struct将具有特定前缀的任何列组合成1列,然后使用to_jsonstruct形成key-value对形状。

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]
)