Как изменить тип столбца с «Array» на «String» с помощью Pyspark?

#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), большое спасибо за ваше предложение. Я попробовал код, который вы предлагаете, но я получаю ошибку, которую я отображаю в конце тела вопроса в качестве редактирования. Вы знаете, как это можно решить? Может быть, вы можете предоставить более подробную информацию о коде? Спасибо