如何在PySpark中从现有列提取键值对生成新列
拆分键值对格式列到多列的解决方法
针对你这种用;分隔组、=分隔键值的字符串列,下面提供几种常用工具的处理方案:
1. SQL 方案
1.1 PostgreSQL(支持灵活拆分与转置)
如果使用PostgreSQL,先把每行的PATH拆成键值对行,再通过聚合转置为列:
-- 第一步:拆分PATH为键值对行 WITH temp AS ( SELECT -- 替换成你的表主键列,用来标识原始行 id, split_part(kv_pair, '=', 1) AS key_name, split_part(kv_pair, '=', 2) AS key_value FROM your_table, unnest(string_to_array(PATH, ';')) AS kv_pair ) -- 第二步:转置为多列 SELECT id, MAX(CASE WHEN key_name = 'country' THEN key_value END) AS country, MAX(CASE WHEN key_name = 'subject' THEN key_value END) AS subject, MAX(CASE WHEN key_name = 'Frequency' THEN key_value END) AS Frequency FROM temp GROUP BY id;
1.2 MySQL(两种提取方式)
方式一:依赖键的固定顺序
如果PATH里的键顺序永远是country;subject;Frequency,直接用字符串截取:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(PATH, ';', 1), '=', -1) AS country, SUBSTRING_INDEX(SUBSTRING_INDEX(PATH, ';', 2), '=', -1) AS subject, SUBSTRING_INDEX(SUBSTRING_INDEX(PATH, ';', 3), '=', -1) AS Frequency FROM your_table;
方式二:不依赖键的顺序
如果键的顺序可能变化,用匹配键名的方式提取:
SELECT SUBSTRING_INDEX(IF(PATH LIKE '%country=%', SUBSTRING_INDEX(PATH, 'country=', -1), ''), ';', 1) AS country, SUBSTRING_INDEX(IF(PATH LIKE '%subject=%', SUBSTRING_INDEX(PATH, 'subject=', -1), ''), ';', 1) AS subject, SUBSTRING_INDEX(IF(PATH LIKE '%Frequency=%', SUBSTRING_INDEX(PATH, 'Frequency=', -1), ''), ';', 1) AS Frequency FROM your_table;
2. Python Pandas 方案
Pandas的处理更灵活,尤其适合键顺序不固定或可能新增键的场景:
方式一:快速拆分(适用于固定键顺序)
import pandas as pd # 假设你的数据已经读取到df中 df[['country', 'subject', 'Frequency']] = df['PATH'].str.split(';', expand=True).apply(lambda col: col.str.split('=').str[-1])
方式二:通用解析(自动适配所有键)
如果PATH里的键可能新增或顺序变化,用字典解析的方式自动生成列:
import pandas as pd def parse_path(path_str): kv_dict = {} for kv in path_str.split(';'): key, value = kv.split('=') kv_dict[key] = value return pd.Series(kv_dict) # 把解析后的键值对合并到原DataFrame df = df.join(df['PATH'].apply(parse_path))
这种方法会自动识别所有出现过的键,生成对应的列,缺失键的行自动填充NaN。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

