Как извлечь все элементы после последнего подчеркивания в pyspark? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть фрейм данных 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'))

Однако результат для двойных значений di git равен нулю, и он возвращает только целое число для однозначных цифр (0-9)

Спасибо!

Ответы [ 4 ]

1 голос
/ 30 марта 2020

Для spark2.4 , Вы должны использовать element_at -1 на своем array после split

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|
+-----------------+------+
1 голос
/ 30 марта 2020

Ответ Мухаммеда очень чистый и хорошее решение. Однако, если вам нужно решение для версий Spark <2.4, вы можете использовать функцию обратной строки и взять первый элемент, повернуть его обратно и превратить в целое число, например: </p>

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    |
+-----------------+------+
0 голосов
/ 30 марта 2020

Добавление других способов:

Вы также можете использовать функцию .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|
#+-----------------+------+-------+
0 голосов
/ 30 марта 2020

Вот как получить последние цифры из приведенного выше серийного номера:

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]))

Если это не работает, пожалуйста, поделитесь результатом.

...