Как создать новый массив подстрок из столбца массива строк в фрейме данных искры

У меня есть фрейм данных искры. Один из столбцов представляет собой тип массива, состоящий из массива текстовых строк различной длины. Я ищу способ добавить новый столбец, представляющий собой массив уникальных левых 8 символов этих строк.

df.printSchema()

root
(...)
 |-- arr_agent: array (nullable = true)
 |    |-- element: string (containsNull = true)

пример данных из столбца "arr_agent":

["NRCANL2AXXX", "NRCANL2A"]
["UTRONL2U", "BKRBNL2AXXX", "BKRBNL2A"]
["NRCANL2A"]
["UTRONL2U", "REUWNL2A002", "BKRBNL2A", "REUWNL2A", "REUWNL2N"]
["UTRONL2U", "UTRONL2UXXX", "BKRBNL2A"]
["MQBFDEFFYYY", "MQBFDEFFZZZ", "MQBFDEFF"  ]

Что мне нужно иметь в новой колонке:

["NRCANL2A"]
["UTRONL2U", "BKRBNL2A"]
["NRCANL2A"]
["UTRONL2U", "BKRBNL2A", "REUWNL2A", "REUWNL2N"]
["UTRONL2U", "BKRBNL2A"]
["MQBFDEFF"  ]

Я уже пытался определить udf, который делает это за меня.

from pyspark.sql import functions as F
from pyspark.sql import types as T

def make_list_of_unique_prefixes(text_array, prefix_length=8):
    out_arr = set(t[0:prefix_length] for t in text_array)
    return(out_arr)

make_list_of_unique_prefixes_udf = F.udf(lambda x,y=8: make_list_of_unique_prefixes(x,y), T.ArrayType(T.StringType()))

Но затем звонит:

df.withColumn("arr_prefix8s", F.collect_set( make_list_of_unique_prefixes_udf(F.col("arr_agent") ))) 

Выдает ошибку AnalysisException: grouping expressions sequence is empty,

Любые советы будут оценены. спасибо

ваш исходный фрейм данных имеет 8 строк, а ожидаемый столбец - всего 6 строк. Что происходит с оставшимися строками? вы хотите агрегировать имя данных и создать новое на основе одного столбца?

anky 22.03.2022 16:13

Извините, опечатка в моем описании, у них должно быть одинаковое количество строк. Я исправлю это.

Flag 23.03.2022 09:28
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете решить эту проблему, используя функции более высокого порядка, доступные в spark 2.4+, используя преобразование и подстроку, а затем возьмите отдельный массив:

from pyspark.sql import functions as F
n = 8
out = df.withColumn("New",F.expr(f"array_distinct(transform(arr_agent,x->substring(x,0,{n})))"))

out.show(truncate=False)

+-----------------------------------------------------+----------------------------------------+
|arr_agent                                            |New                                     |
+-----------------------------------------------------+----------------------------------------+
|[NRCANL2AXXX, NRCANL2A]                              |[NRCANL2A]                              |
|[UTRONL2U, BKRBNL2AXXX, BKRBNL2A]                    |[UTRONL2U, BKRBNL2A]                    |
|[NRCANL2A]                                           |[NRCANL2A]                              |
|[UTRONL2U, REUWNL2A002, BKRBNL2A, REUWNL2A, REUWNL2N]|[UTRONL2U, REUWNL2A, BKRBNL2A, REUWNL2N]|
|[UTRONL2U, UTRONL2UXXX, BKRBNL2A]                    |[UTRONL2U, BKRBNL2A]                    |
|[MQBFDEFFYYY, MQBFDEFFZZZ, MQBFDEFF]                 |[MQBFDEFF]                              |
+-----------------------------------------------------+----------------------------------------+

Другие вопросы по теме