如何提取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|
#+-----------------+------+-------+
我有一个 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|
#+-----------------+------+-------+