这使问题here更加丰富。
substring
函数的效果更好,因为它不仅限于正则表达式字符。
但是,如果要始终拆分的列具有定界字符,则上述问题的答案就可以满足。
如果我有一个像这样的数据框c1
:
+-----------------+
| name|
+-----------------+
| ETX2800_PM3|
| ETX2800_PM3|
| STP2372|
| STP2372|
| ETX2800_PM3|
|TRK2353_CGRA_3_35|
|TRK2353_CGRA_3_35|
如果我使用split方法:
c2=c1.withColumn('first split', f.expr("""substring(name,instr(name,'_')+1,length(name))"""))
我明白了
+-----------------+-----------+
| name|first split|
+-----------------+-----------+
| ETX2800_PM3| PM3|
| ETX2800_PM3| PM3|
| STP2372| STP2372|
| STP2372| STP2372|
| ETX2800_PM3| PM3|
|TRK2353_CGRA_3_35| CGRA_3_35|
|TRK2353_CGRA_3_35| CGRA_3_35|
但是我希望null
位于第三和第四行。
有办法吗?
答案 0 :(得分:1)
使用udf
比使用regex
更易读:
def fun(x):
s = x.split("_",1)
return s[-1] if len(s)>1 else None
myudf = F.udf(fun,StringType())
df.withColumn("Spl",myudf("name")).show()
+-----------------+---------+
| name| Spl|
+-----------------+---------+
| ETX2800_PM3| PM3|
| ETX2800_PM3| PM3|
| STP2372| null|
| STP2372| null|
| ETX2800_PM3| PM3|
|TRK2353_CGRA_3_35|CGRA_3_35|
|TRK2353_CGRA_3_35|CGRA_3_35|
+-----------------+---------+