我有一个pyspark数据帧,它有一个单列_c0
a|b|c|clm4=1|clm5=3
a|b|c|clm4=9|clm6=60|clm7=23
我正在尝试将其转换为如下所示的选定列的数据帧
clm1,clm2,clm3,clm4,clm6,clm7,clm8
a, b, c, 1, null,null,null
a, b, c, 9, 60, 23, null
请注意,我删除了clm5
并添加了clm8
我正在使用以下代码:
transform_expr = """
transform(split(_c0, '[|]'), (x, i) ->
struct(
IF(x like '%=%', substring_index(x, '=', 1), concat('_c0', i+1)),
substring_index(x, '=', -1)
)
)
"""
df = df.select("_c0", explode(map_from_entries(expr(transform_expr))).alias("col_name", "col_value")).groupby("_c0").pivot('col_name').agg(first('col_value')).drop("_c0")
问题是我有多个巨大的文件,我想在这些文件上执行此操作,每个文件的结果应该包含相同的列(这也是一个长列表),如果输入文件中不存在这些列,这些列可能会有空值。如何向上述代码中添加一个条件,以便仅选择列名列表中的列
您可以在列表中包含所需的列,并使用它过滤转换后的数组:
现在使用^{} 函数在转换步骤后添加此过滤器:
这将过滤掉列表中不存在的所有列
最后,使用简单的选择表达式将缺少的列添加为null:
相关问题 更多 >
编程相关推荐