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_json
将struct
形成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]
)
我目前在我的 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_json
将struct
形成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]
)