Pyspark dataframe Column 基于特定字符的索引值的子字符串

Sid*_*idd 1 apache-spark apache-spark-sql pyspark

专家们,我有一个简单的要求,但无法找到实现目标的功能。

我正在使用 pyspark (spark 1.6 和 Python 2.7)并有一个简单的 pyspark 数据框列,其中包含某些值,例如-

1849adb0-gfhe6543-bduyre763ryi-hjdsgf87qwefdb-78a9f4811265_ABC
1849adb0-rdty4545y4-657u5h556-zsdcafdqwddqdas-78a9f4811265_1234
1849adb0-89o8iulk89o89-89876h5-432rebm787rrer-78a9f4811265_12345678
Run Code Online (Sandbox Code Playgroud)

这些值的共同点是有一个“下划线”,之后有某些字符(可以是任意数量的字符)。这些是我有兴趣在输出中获得的字符。我想使用子字符串或正则表达式函数,它将找到列值中“下划线”的位置,并选择“从下划线位置+1”直到列值的末尾。因此输出看起来像一个数据框,其值为-

ABC
1234
12345678
Run Code Online (Sandbox Code Playgroud)

我尝试使用子字符串,但可以找到任何内容来“索引”“下划线”

谢谢!

小智 5

无需使用任何正则表达式

请尝试如下所示。基本上在_ char 上拆分并通过getItem()获取第二项

>>> from pyspark.sql import functions as F
>>> my_list = [("1849adb0-gfhe6543-bduyre763ryi-hjdsgf87qwefdb-78a9f4811265_ABC",),("1849adb0-rdty4545y4-657u5h556-zsdcafdqwddqdas-78a9f4811265_1234",),("1849adb0-89o8iulk89o89-89876h5-432rebm787rrer-78a9f4811265_12345678",)]
>>> my_df = spark.createDataFrame(my_list, schema=["input_v"])
>>> my_df.withColumn("get_val", F.split(F.col("input_v"),"_").getItem(1)).show(20,False)
Run Code Online (Sandbox Code Playgroud)

结果

+-------------------------------------------------------------------+--------+
|input_v                                                            |get_val |
+-------------------------------------------------------------------+--------+
|1849adb0-gfhe6543-bduyre763ryi-hjdsgf87qwefdb-78a9f4811265_ABC     |ABC     |
|1849adb0-rdty4545y4-657u5h556-zsdcafdqwddqdas-78a9f4811265_1234    |1234    |
|1849adb0-89o8iulk89o89-89876h5-432rebm787rrer-78a9f4811265_12345678|12345678|
+-------------------------------------------------------------------+--------+```


Run Code Online (Sandbox Code Playgroud)