python - 如何将字符串数组转换为具有条件的结构数组
问题描述
我有一个单列的 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")
问题是我有多个要对其执行此操作的大文件,并且每个文件的结果应包含相同的列(这也是一个长列表),如果输入文件中不存在这些列,则它们可以具有空值。如何向上述代码添加条件以仅选择列名列表中存在的那些列?
解决方案
您可以在列表中包含所需的列并使用它来过滤转换后的数组:
column_list = ["clm1", "clm2", "clm3", "clm4", "clm6", "clm7", "clm8"]
filter
现在使用函数在转换步骤之后添加此过滤器:
column_filter = ','.join(f"'{c}'" for c in column_list)
transform_expr = f"""
filter(transform(split(_c0, '[|]'), (x, i) ->
struct(
IF(x like '%=%', substring_index(x, '=', 1), concat('clm', i+1)) as name,
substring_index(x, '=', -1) as value
)
), x -> x.name in ({column_filter}))
"""
这将过滤掉列表中不存在的所有列。
最后,使用简单的选择表达式将缺失的列添加为空值:
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")
## add missing columns as nulls
final_columns = [col(c).alias(c) if c in df.columns else lit(None).alias(c) for c in column_list]
df.select(*final_columns).show()
#+----+----+----+----+----+----+----+
#|clm1|clm2|clm3|clm4|clm6|clm7|clm8|
#+----+----+----+----+----+----+----+
#| a| b| c| 9| 60| 23|null|
#| a| b| c| 1|null|null|null|
#+----+----+----+----+----+----+----+
推荐阅读
- gwt - Gwt Material Design:MaterialSlider 在经典开发模式下不工作
- pandas - 如何迭代数据框列中的列表项
- haskell - catamorphical 函数 要么 aa -> a?
- xquery - Xquery 替换具有前缀的元素值
- python - Python,硒 find_element_by_link_text 不起作用
- python - 安全复制文件python程序 - 代码中有什么问题
- amazon-web-services - 描述附加在 RDS 实例上的 RDS cloudwatch 警报
- javascript - 单击按钮文本时未触发客户端按钮单击事件
- jmeter - 在响应头中执行脚本后:连接正在关闭
- php - 为什么 wamp localhost 不断向我显示通知?