pyspark Regexp_Extract-从字符串列中提取多个单词

时间:2019-01-03 15:15:39

标签: pyspark

我正在尝试使用pyspark regexp从字符串列中提取单词。

下面的我的数据框:

ID, Code

10, A1005*B1003

12, A1007*D1008*C1004

result=df.withColumn('Code1', regexp_extract(col(Code), '\w+',0))

输出:

ID, Code,              Code1, 

10, A1005*B1003,       A1005

12, A1007*D1008*C1004, A1007

result=df.withColumn('Code1', regexp_extract(col(Code), '\w+',0))

输出:

ID, Code,              Code1, 

10, A1005*B1003,       A1005

12, A1007*D1008*C1004, A1007

我想从“代码”列中提取代码,并希望我的DataFrame显示如下。

ID, Code,              Code1,  Code2,  Code3

10, A1005*B1003,       A1005,  B1003,  null

12, A1007*D1008*C1004, A1007,  D1008,  C1004

1 个答案:

答案 0 :(得分:0)

假设您的ID列对于每一行都是唯一的;这是使用splitexplode然后使用pivot的一种方法:

import pyspark.sql.functions as f

(df.select('ID', 'Code', f.posexplode(f.split('Code', '\\*')))
   .withColumn('pos', f.concat(f.lit('code'), f.col('pos')))
   .groupBy('ID', 'Code').pivot('pos').agg(f.first('col'))
   .show())
+---+-----------------+-----+-----+-----+
| ID|             Code|code0|code1|code2|
+---+-----------------+-----+-----+-----+
| 10|      A1005*B1003|A1005|B1003| null|
| 12|A1007*D1008*C1004|A1007|D1008|C1004|
+---+-----------------+-----+-----+-----+

另一个无需旋转的选项:

df1 = df.select('ID', 'Code', f.split('Code', '\\*').alias('Codes'))
maxCodes = df1.agg(f.max(f.size('Codes'))).first()[0]      # 3
df1.select(
  'ID', 'Code', 
  *[f.col('Codes').getItem(i).alias(f'Code{i+1}') for i in range(maxCodes)]
).show()
+---+-----------------+-----+-----+-----+
| ID|             Code|Code1|Code2|Code3|
+---+-----------------+-----+-----+-----+
| 10|      A1005*B1003|A1005|B1003| null|
| 12|A1007*D1008*C1004|A1007|D1008|C1004|
+---+-----------------+-----+-----+-----+