apache-spark - pyspark 将字符串拆分为键值对并提取某些值
问题描述
我有多个键值对作为字符串的列。
前任:
rb=99;cs_y1=0;y2_co=CA;y2_r=ON;y2_ct=Kitchener;y2_z=N2N;y2_isp=Bell DSL Internet;y2_org=Bell DSL Internet
我需要提取与键 y2_co、y2_r、y2_z 和 y2_org 对应的值。
df.withColumn("co", split(split(col("_c1"), ";").getItem(2)),"=").getItem(1))
.withColumn("r", split(split(col("_c1"), ";").getItem(3)),"=").getItem(1))
.withColumn("z", split(split(col("_c1"), ";").getItem(5)),"=").getItem(1))
.withColumn("org", split(split(col("_c1"), ";").getItem(7),"=").getItem(1))
我有上面的适用于这个字符串,但键值对的数量不是恒定的。如何调整上面的语句来处理可变长度的键值对?
解决方案
使用str_to_map,见下文:
from pyspark.sql import functions as F
keys = ["y2_co", "y2_r", "y2_z", "y2_org"]
df.withColumn('m', F.expr("str_to_map(_c1,';','=')")) \
.selectExpr("*", *[ f"m['{k}'] as `{k}`" for k in keys ]) \
.show()
+--------------------+--------------------+-----+----+----+-----------------+
| _c1| m|y2_co|y2_r|y2_z| y2_org|
+--------------------+--------------------+-----+----+----+-----------------+
|rb=99;cs_y1=0;y2_...|[rb -> 99, cs_y1 ...| CA| ON| N2N|Bell DSL Internet|
+--------------------+--------------------+-----+----+----+-----------------+
推荐阅读
- python - 如何获取 Sagemaker 实例 CPU 利用率
- node.js - NodeJS & RxJS:将 observables 转换为 nodeJs 流
- regex - bash 中的正则表达式量词——简单与扩展匹配 {n} 次
- excel - Excel中的范围加法和乘法
- python - 尝试对 .csv 数据集进行 linregress 时,Scipy.stats 错误“要解压的值太多”
- azure - 使用 Terraform 配置 Azure 媒体服务:特别是使用 Widervine DRM 的内容密钥策略
- visual-c++ - 使用 git bash 在命令行上设置 cmake 的 msvc 编译器标志
- c# - 如何使用来自 http 请求的数据填充 xamarin 集合视图?
- android - 对处理 git 合并冲突的一群人有什么解决方案吗
- api - 如何在 Delphi 中设置 RestRequest 的 Authorization 标头和 Body 部分?