如何提取pyspark中最后一个下划线后的所有元素?

How to extract all elements after last underscore in pyspark?

我有一个 pyspark 数据框,其中有一列我正试图从中提取信息。举个例子,该列是 4 个外键的组合,看起来像这样:

示例 1:12345-123-12345-4

示例 2:5678-4321-123-12

我正在尝试提取字符串的最后一段,在本例中为 4 和 12。知道如何执行此操作吗?

我试过以下方法:

df.withColumn("result", sf.split(sf.col("column_to_split"), '\_')[1])\
  .withColumn("result", sf.col("result").cast('integer'))

但是,双位数的结果为空,并且它只是 returns 个位数 (0-9) 的整数

谢谢!

这是获取上述序列号最后一位数字的方法:

serial_no = '12345-123-12345-4'
last_digit = serial_no.split('-')[-1]
print(last_digit)

所以在你的情况下,尝试:

df.withColumn("result", int(sf.col("column_to_split").split('-')[-1]))

如果还是不行,请分享结果。

对于 spark2.4,您应该在 split [=15= 之后的 array 上使用 element_at -1 ]

from pyspark.sql import functions as sf
df.withColumn("result", sf.element_at(sf.split("column_to_split","\-"),-1).cast("int")).show()

+-----------------+------+
|  column_to_split|result|
+-----------------+------+
|12345-123-12345-4|     4|
| 5678-4321-123-12|    12|
+-----------------+------+

Mohammad 的回答非常简洁,是一个不错的解决方案。但是,如果您需要 Spark 版本 < 2.4 的解决方案,您可以利用反向字符串功能并获取第一个元素,将其反向并转换为整数,f.e.:

import pandas as pd
import pyspark.sql.functions as f
import pyspark.sql.types as t

df = pd.DataFrame()
df['column_to_split'] = ["12345-123-12345-4", "5678-4321-123-12"]
df = spark.createDataFrame(df)

df.withColumn("result", 
              f.reverse(f.split(f.reverse("column_to_split"), "-")[0]). \
               cast(t.IntegerType())).show(2, False)

+-----------------+------+
|column_to_split  |result|
+-----------------+------+
|12345-123-12345-4|4     |
|5678-4321-123-12 |12    |
+-----------------+------+

另一种加法:

您还可以使用 .regexp_extract()(或).substring_index() 函数:

Example:

df.show()
#+-----------------+
#|  column_to_split|
#+-----------------+
#|12345-123-12345-4|
#| 5678-4321-123-12|
#+-----------------+
df.withColumn("result",regexp_extract(col("column_to_split"),"([^-]+$)",1).cast("int")).\
withColumn("result1",substring_index(col("column_to_split"),"-",-1).cast("int")).\
show()
#+-----------------+------+-------+
#|  column_to_split|result|result1|
#+-----------------+------+-------+
#|12345-123-12345-4|     4|      4|
#| 5678-4321-123-12|    12|     12|
#+-----------------+------+-------+