#python #apache-spark #dictionary #pyspark #dataset
#python #apache-spark #словарь #pyspark #набор данных
Вопрос:
У меня есть набор данных, содержащий столбец со следующей схемой:
root
|-- id_: string (nullable = true)
|-- payload: array (nullable = true)
| |-- element: map (containsNull = true)
| | |-- key: string
| | |-- value: string (valueContainsNull = true)
где видно, что второй столбец, payload
, содержит списки словарей в качестве своих записей. Я хотел бы изменить тип этого столбца с array
на string
, и я попробовал следующий код, как предложено https://sparkbyexamples.com/pyspark/pyspark-convert-array-column-to-string-column / :
df = df.withColumn("payload", concat_ws(",",col("payload")))
Однако я получаю неожиданную ошибку (см. Ниже). Я думаю, это связано с тем, что списки, содержащиеся в каждой записи столбца, хранят словари. Кто-нибудь знает, как обойти эту проблему?
argument 2 requires (array<string> or string) type, however,`payload` is of array<map<string,string>> type.;
Большое спасибо,
Мариоанзас
РЕДАКТИРОВАТЬ ПОСЛЕ предложенного @SRINIVAS решения: я получаю следующую ошибку.
Syntax Error.
File "unnamed_3", line 7
df.withColumn("payload", F.expr(concat_ws(',',flatten(transform(payload,x -> transform(map_keys(x),y -> concat(y,x[y])))))))
^
SyntaxError: invalid syntax
Комментарии:
1.
F.expr("..")
примет аргумент типа string , правильный —F.expr("concat_ws(',',flatten(transform(payload,x -> transform(map_keys(x),y -> concat(y,x[y])))))")
2. Привет @Srinivas, спасибо за ваш комментарий. Я попробовал то, что вы предложили, но при построении схемы я все еще получаю, что полезная нагрузка имеет тип
array
, а ее элементы имеют типmap
. Таким образом, он компилируется в течение длительного времени (у меня большой фрейм данных), но, похоже, ничего не делает: (
Ответ №1:
Преобразуйте внутренний ключ карты, данные значения в массив строки, затем сгладьте данные и передайте результат concat_ws
функции.
Проверьте приведенный ниже код.
df.printSchema
root
|-- id_: string (nullable = true)
|-- payload: array (nullable = true)
| |-- element: map (containsNull = true)
| | |-- key: string
| | |-- value: string (valueContainsNull = true)
df.show()
---- ----------------
|id_ |payload |
---- ----------------
|id_a|[[a -> a value]]|
|id_b|[[b -> b value]]|
|id_c|[[c -> c value]]|
---- ----------------
df
.withColumn(
"payload",
F.expr("concat_ws(',',flatten(transform(payload,x -> transform(map_keys(x),y -> concat(y,x[y])))))")
).show()
---- --------
|id_ |payload |
---- --------
|id_a|aa value|
|id_b|bb value|
|id_c|cc value|
---- --------
Версия Spark — 2.4
Комментарии:
1. Привет, Шринивас (@Srinivas), большое спасибо за ваше предложение. Я попробовал код, который вы предлагаете, но я получаю ошибку, которую я отображаю в конце тела вопроса в качестве редактирования. Вы знаете, как это можно решить? Может быть, вы можете предоставить более подробную информацию о коде? Спасибо