Я хочу извлечь всю запись в виде списка на основе совпадения с шаблоном в PySpark - PullRequest
1 голос
/ 17 июня 2020

У меня есть поле с именем tags. Он содержит одно или несколько значений, начинающихся с размера _.

Шаблон: size_

Например:

+---------------------------------------------+
|                tags                         |
+---------------------------------------------+
|The size available are size_10 and size_100. |
|                                             |
|The size available are size_10               |
|The size available are size_20               |

I хотите извлечь только значение в виде массива (т.е.

+----------------------------------------------------------+
|                tags                         |size        |
+----------------------------------------------------------+
|The size available are size_10 and size_100. |[10, 20]    |
|                                             |    []      |
|The size available are size_10               |   [10]     | 
|The size available are size_20               |   [20]     |

Не могли бы вы помочь мне решить ...

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Python Эквивалент для приведенного выше кода:

df.withColumn('d',f.split(f.regexp_replace(f.concat_ws(',',f.array_except(f.split('data',' '),f.split(f.regexp_replace('data','(size_\d+)',''),' ')))
                                  ,"[^0-9$,]",""),',')).show(20,False)

Если ваш набор данных не такой большой, вы также можете сделать это с udf

import re
from pyspark.sql.functions import udf

extract = udf(lambda s: list(map(lambda x: x.split('_')[1] if len(x)>0 else x,re.findall(r'(size_\d+)', s))), ArrayType(StringType()))

df.withColumn('values', extract('data')).show()

вывод в обоих случаях

+--------------------+---------+
|                data|   values|
+--------------------+---------+
|The size availabl...|[10, 100]|
|The size availabl...|     [10]|
|                    |       []|
|The size availabl...|     [20]|
|             size_10|     [10]|
+--------------------+---------+
1 голос
/ 17 июня 2020

В scala версия python будет практически идентична:

val df = Seq("The size available are size_10 and size_100."," ","The size available are size_10","The size available are size_20").toDF()
df.show(false)
+--------------------------------------------+
|value                                       |
+--------------------------------------------+
|The size available are size_10 and size_100.|
|                                            |
|The size available are size_10              |
|The size available are size_20              |
+--------------------------------------------+


df.select('value,split(regexp_replace('value, "(?:size_?)[^\\s]+","")," ").as("a"),split('value," ").as("b"))
  .select('value,split(regexp_replace(concat_ws(",",array_except('b,'a)),"[^0-9$,]",""),",").as("size"))
  .show(false)


+--------------------------------------------+---------+
|value                                       |size     |
+--------------------------------------------+---------+
|The size available are size_10 and size_100.|[10, 100]|
|                                            |[]       |
|The size available are size_10              |[10]     |
|The size available are size_20              |[20]     |
+--------------------------------------------+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...