在PySpark中从Dataframe列获取最后一个/分隔值

3

我正在尝试获取'/'之后的最后一个字符串。

该列可能会像这样: "lala/mae.da/rg1/zzzzz"(不一定只有3个/),我想返回:zzzzz

在SQL和Python中很容易解决,但我想知道在PySpark中是否有方法可以解决。

在Python中解决:

original_string = "lala/mae.da/rg1/zzzzz"
last_char_index = original_string.rfind("/")
new_string = original_string[last_char_index+1:]

或者直接:
new_string = original_string.rsplit('/', 1)[1]

在SQL中:

RIGHT(MyColumn, CHARINDEX('/', REVERSE(MyColumn))-1)

针对PySpark,我想到的方案是:

df = df.select(col("MyColumn").rsplit('/', 1)[1])

但我遇到了以下错误:TypeError: 'Column' object is not callable,而且我甚至不确定Spark是否允许我使用rsplit。
您有任何建议可以解决这个问题吗?
3个回答

3

虽然@Pav3k的答案很好,但我还想补充一种解决方案。 element_at可以从列表中获取特定位置的元素:

from pyspark.sql import functions as F
df = df.withColumn('my_col_split', F.split(df['MyColumn'], '/'))\
                          .select('MyColumn',F.element_at(F.col('my_col_split'), -1).alias('rsplit')
                                 )

>>> df.show(truncate=False)

+---------------------+------+
|MyColumn             |rsplit|
+---------------------+------+
|lala/mae.da/rg1/zzzzz|zzzzz |
|fefe                 |fefe  |
|fe/fe/frs/fs/fe32/4  |4     |
+---------------------+------+

Pav3k使用了DF。

2
import pandas as pd
from pyspark.sql import functions as F

df = pd.DataFrame({"MyColumn": ["lala/mae.da/rg1/zzzzz", "fefe", "fe/fe/frs/fs/fe32/4"]})

df = spark.createDataFrame(df)

df.show(truncate=False)

# output
+---------------------+
|MyColumn             |
+---------------------+
|lala/mae.da/rg1/zzzzz|
|fefe                 |
|fe/fe/frs/fs/fe32/4  |
+---------------------+

(
    df
    .withColumn("NewCol", 
                F.split("MyColumn", "/")
               )
    .withColumn("NewCol", F.col("Newcol")[F.size("NewCol") -1])
    .show()
)

# output
+--------------------+------+
|            MyColumn|NewCol|
+--------------------+------+
|lala/mae.da/rg1/z...| zzzzz|
|                fefe|  fefe|
| fe/fe/frs/fs/fe32/4|     4|
+--------------------+------+


谢谢,这正是我想要实现的!! - xavier

2
自Spark 2.4以来,您可以使用内置函数split来拆分字符串,然后使用内置函数element_at获取所得数组的最后一个元素,如下所示:
from pyspark.sql import functions as F

df = df.select(F.element_at(F.split(F.col("MyColumn"), '/'), -1))

这也可以,谢谢! - xavier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接