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

仅在第一个实例上拆分pyspark列,pyspark,split,Pyspark,Split,这是对所提问题的丰富。 子字符串函数工作得更好,因为它不仅限于正则表达式字符。 但是,如果要拆分的列始终具有分隔字符,则上述问题的答案满足要求。 如果我有这样一个数据帧c1: +-----------------+ | name| +-----------------+ | ETX2800_PM3| | ETX2800_PM3| | STP2372| | STP2372| | ETX2800_PM3| |T

这是对所提问题的丰富。
子字符串
函数工作得更好,因为它不仅限于正则表达式字符。 但是,如果要拆分的列始终具有分隔字符,则上述问题的答案满足要求。 如果我有这样一个数据帧
c1

+-----------------+
|             name|
+-----------------+
|      ETX2800_PM3|
|      ETX2800_PM3|
|          STP2372|
|          STP2372|
|      ETX2800_PM3|
|TRK2353_CGRA_3_35|
|TRK2353_CGRA_3_35|
如果我使用拆分方法:

c2=c1.withColumn('first split', f.expr("""substring(name,instr(name,'_')+1,length(name))"""))
我明白了

但是我希望第3行和第4行中的
null

有没有办法做到这一点?

使用比使用
regex
更可读的
udf

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()

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|
+-----------------+---------+