删除列 psypark 数据框中的前 n 个字符

LN_*_*N_P 2 substring slice apache-spark pyspark

我正在尝试为 pyspark 数据框中的每一行删除一列中的前两个字符。以下字符的长度不同,因此我无法使用substring的解决方案。

示例数据框:

columns = ['text']
vals = [(h0123),(b012345), (xx567)]
Run Code Online (Sandbox Code Playgroud)

编辑 实际上问题变得更加复杂,因为有时我有一个字母和两个零作为第一个字符,然后需要删除两个 0。

例子:

columns = ['text']
vals = [(h0123),(b012345), (x00567), (L0034)]
Run Code Online (Sandbox Code Playgroud)

预期结果:

(123),(12345), (567), (34)
Run Code Online (Sandbox Code Playgroud)

pau*_*ult 6

您可以使用pyspark.sql.functions.expr()来调用substring并传入字符串的长度减n作为len参数。

from pyspark.sql.functions import expr

n = 2
df.withColumn(
    "new_text",
    expr("substring(text, {n}+1, length(text)-{n})".format(n=n))
).show()
#+-------+--------+
#|   text|new_text|
#+-------+--------+
#|  h0123|     123|
#|b012345|   12345|
#|  xx567|     567|
#+-------+--------+
Run Code Online (Sandbox Code Playgroud)

您还可以将其转换为函数:

def lstrip(column, n):
    # should probably add error checking on inputs
    return expr("substring(`{col}`, {n}+1, length(`{col}`)-{n})".format(col=column, n=n))

df.withColumn("new_text", lstrip(column="text", n=n)).show()
# Same as above
Run Code Online (Sandbox Code Playgroud)