pyspark Regexp_Extract-从字符串列中提取多个单词
我正在尝试使用pyspark regexp从字符串列中提取单词 下面是我的数据框: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
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