Я использую новую функцию pyspark arrays_zip в v2.4, чтобы сжать следующие массивы:
["ABK","APR","ABF"]
["R0789","R0602","E039"])
Результат:
[{"0":"ABK","1":"R0789"},{"0":"APR","1":"R0602"},{"0":"ABF","1":"E039"}]
Как получить следующеевместо результата?
[{"ABK":"R0789"},{"APR":"R0602"},{"ABF":"E039"}]
Я не архивирую столбцы напрямую.Столбцы в формате JSON, поэтому я использую get_json_object для получения массива строк, т.е. он выглядит как массив, но на самом деле это строка.Затем я преобразую строку в фактический массив в пользовательской функции, используя функцию split.
arrays_zip(myStringArrayToArray(get_json_object(...
Документация pyspark показывает этот пример и не показывает / не упоминает значения индекса, включенные в результат:
from pyspark.sql.functions import arrays_zip
df = spark.createDataFrame([(([1, 2, 3], [2, 3, 4]))], ['vals1', 'vals2'])
df.select(arrays_zip(df.vals1, df.vals2).alias('zipped')).collect()
[Row(zipped=[Row(vals1=1, vals2=2), Row(vals1=2, vals2=3), Row(vals1=3, vals2=4)])]
Обновление: Я подтвердил, что мой пример массива соответствует результатам примера, приведенного в документации.Поскольку я использую arrays_zip против массивов, он использует индексы.Если бы они были столбцами (как документация), они были бы именами столбцов (а не индексами).Поэтому тот факт, что я выполняю преобразование строки в массив, здесь не является проблемой.
Я ожидал, что arrays_zip будет вести себя больше как функция Python zip, например,
a1 = [1, 2, 3]
a2 = ['one', 'two', 'three']
zip(a1, a2)
{(2, 'two'), (3, 'three'), (1, 'one')}
Может быть, UDFздесь единственный вариант.