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

pyspark Regexp_Extract-从字符串列中提取多个单词,pyspark,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

我正在尝试使用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
输出:

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
输出:

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
我想从代码列中提取代码,并希望我的数据框显示如下

ID, Code,              Code1,  Code2,  Code3

10, A1005*B1003,       A1005,  B1003,  null

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

假设您的
ID
列对于每一行都是唯一的;下面是一种使用
拆分
分解
然后使用
透视
的方法:

导入pyspark.sql.f函数
(df.select('ID','Code',f.posexplode(f.split('Code','\\*'))
.带列('pos',f.concat(f.lit('code'),f.col('pos'))
.groupBy('ID','Code').pivot('pos').agg(f.first('col'))
.show())
+---+-----------------+-----+-----+-----+
|ID |代码|代码0 |代码1 |代码2|
+---+-----------------+-----+-----+-----+
|10 | A1005*B1003 | A1005 | B1003 |空|
|12 | A1007*D1008*C1004 | A1007 | D1008 | C1004|
+---+-----------------+-----+-----+-----+
不旋转的另一个选项:

df1=df。选择('ID','code',f.split('code','\\\*')。别名('code'))
maxCodes=df1.agg(f.max(f.size('code'))).first()[0]#3
df1.select(
“ID”、“代码”,
*[f.col('Code').getItem(i).范围内i的别名(f'Code{i+1}')(maxCodes)]
).show()
+---+-----------------+-----+-----+-----+
|ID |代码|代码1 |代码2 |代码3|
+---+-----------------+-----+-----+-----+
|10 | A1005*B1003 | A1005 | B1003 |空|
|12 | A1007*D1008*C1004 | A1007 | D1008 | C1004|
+---+-----------------+-----+-----+-----+

Hi可能重复,谢谢您的快速回复。代码列包含算术运算符。代码列可以存储(A1002*B1002)-C1003+D1005或A1004/(C1008-D1006)等值。字符串中的代码数最多可达7个。如果要提取的单词只包含数字和字母,则可以将上述两个选项中的
f.split(…)
替换为
f.array\u remove(f.split('code','\\W+'),'')
,并应给出所需的结果。您好,你能帮我转置下面相同的数据集吗。ID代码\u T 10 A1005*B1003 A1005 10 A1005*B1003 B1003 12 A1007*D1008*C1004 A1007 12 A1007*D1008*C1004 D1008 12 A1007*D1008*C1004 D1008 12 A1007*D1008*C1004 C1004