首页 > 解决方案 > 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))

我有上面的适用于这个字符串,但键值对的数量不是恒定的。如何调整上面的语句来处理可变长度的键值对?

标签: apache-sparkpysparkapache-spark-sql

解决方案


使用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|
+--------------------+--------------------+-----+----+----+-----------------+

推荐阅读