我試圖獲取'/'之后的最后一個字串。
該列可以如下所示:“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。
你對我如何解決這個問題有什么建議嗎?
uj5u.com熱心網友回復:
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|
-------------------- ------
uj5u.com熱心網友回復:
從 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))
uj5u.com熱心網友回復:
盡管@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使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345664.html
