我正在尝试使用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
答案 0 :(得分:0)
假设您的ID
列对于每一行都是唯一的;这是使用split
,explode
然后使用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|
+---+-----------------+-----+-----+-----+