Pyspark dataframe Столбец Подстрока на основе значения индекса конкретного символа - PullRequest
1 голос
/ 18 октября 2019

Эксперты, у меня есть простое требование, но я не могу найти функцию для достижения цели.

Я использую pyspark (spark 1.6 и Python 2.7) и у меня есть простой столбец pyspark dataframe с определенными значениями, такими как-

1849adb0-gfhe6543-bduyre763ryi-hjdsgf87qwefdb-78a9f4811265_ABC
1849adb0-rdty4545y4-657u5h556-zsdcafdqwddqdas-78a9f4811265_1234
1849adb0-89o8iulk89o89-89876h5-432rebm787rrer-78a9f4811265_12345678

Общим в этих значениях является то, что есть одно «подчеркивание», и после этого есть определенные символы (может быть любым количеством символов). Это те персонажи, которые мне интересны в выводе. Я хочу использовать функцию подстроки или регулярных выражений, которая найдет позицию «подчеркивания» в значениях столбца и выберет «от позиции подчеркивания +1» до конца значения столбца. Таким образом, выходные данные будут выглядеть как информационный кадр со значениями как -

ABC
1234
12345678

Я попытался использовать подстроку, но смог найти что-нибудь, чтобы "проиндексировать" "подчеркивание"

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Нет необходимости использовать регулярное выражение

Пожалуйста, попробуйте ниже, как показано. В основном Разделение на _ 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)

Результат

+-------------------------------------------------------------------+--------+
|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|
+-------------------------------------------------------------------+--------+```


1 голос
/ 18 октября 2019

Вы можете использовать regexp_extract для извлечения данных после _

Example:

from pyspark.sql.functions import *

df=spark.sql("""select stack(3,"1849adb0-gfhe6543-bduyre763ryi-hjdsgf87qwefdb-78a9f4811265_ABC","1849adb0-rdty4545y4-657u5h556-zsdcafdqwddqdas-78a9f4811265_1234","1849adb0-89o8iulk89o89-89876h5-432rebm787rrer-78a9f4811265_12345678") as (txt)""")

df.withColumn("extract",regexp_extract(col("txt"),"_(.*)",1)).show(10,False)

Result:

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