仅在第一个实例上拆分pyspark列

时间:2020-09-14 13:17:42

标签: pyspark split

这使问题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位于第三和第四行。 有办法吗?

1 个答案:

答案 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|
+-----------------+---------+
相关问题