Слияние фреймов данных, где столбец является переменной структурой - Pyspark - PullRequest
1 голос
/ 02 апреля 2020

У меня есть куча фреймов данных, которые мне нужно объединить, у них 4 одинаковых столбца, но в одном из этих столбцов (параметров) есть переменные поля, в зависимости от фрейма данных, я привел примеры ниже:

+---------+-----------+--------------------------------------------------------------------------------------------------------------------------+-------------------+
|attribute|operation  |params                                                                                                                    |timestamp          |
+---------+-----------+--------------------------------------------------------------------------------------------------------------------------+-------------------+
|profile  |CREATE_CARD|[50d966f2-2820-441a-afbe-851e45eeb13e, 1s9miu7t6an50fplvvhybow6edx9_STG, 993270335, CREATED_CARD, 8236961209881953, kobo] |2020-02-24 03:07:04|
+---------+-----------+--------------------------------------------------------------------------------------------------------------------------+-------------------+

+---------+---------+--------------------------------------------------------------------------------------------------+-------------------+

|attribute|operation|params                                                                                            |timestamp          |
+---------+---------+--------------------------------------------------------------------------------------------------+-------------------+
|profile  |UPDATE   |[0792b8d1-7ad9-43fc-9e75-9b1f2612834c, rkm9a7mescuwp0s4i01zlwi2ftu9_STG, 993270329, primary_email]|2020-02-12 18:13:08|
+---------+---------+--------------------------------------------------------------------------------------------------+-------------------+

+---------+---------+-----------------------------------------------------------------------------------+-------------------+
|attribute|operation|params                                                                             |timestamp          |
+---------+---------+-----------------------------------------------------------------------------------+-------------------+
|member   |CREATE   |[ea8e7e39-4a0a-4d41-b47e-70c8e56a2bca, h4m015wf1qxwrogj6d9l2uc5bsa9_STG, 993270331]|2020-01-02 09:51:32|
+---------+---------+-----------------------------------------------------------------------------------+-------------------+

Как мне получить все строки этих фреймов данных в один фрейм данных без добавления нулевых значений к пропущенным полям? Я должен объединить кадры данных, чтобы сохранить окончательный кадр данных, отсортированный по временной метке поля. Я не хочу сохранять параметры в виде строки, поскольку мне нужно сохранить окончательный объединенный фрейм данных в виде JSON в тексте, а сохранение его в виде строки добавит экранированные символы в конечный файл, чего я пытаюсь избежать.

Я пытался преобразовать Dataframes в JSON объект, используя toJSON(), а затем объединить его, но toJSON() дал мне RDD с элементами строкового типа, которые я не могу отсортировать. Я также попытался union, но это не сработало, поскольку столбец «params» - это отдельная структура в каждом из приведенных выше фреймов данных. Какой самый эффективный способ сделать это?

Окончательный вывод должен выглядеть следующим образом:

+---------+-----------+--------------------+-------------------------------------------------------------------------------------------------------------------------+
|attribute|operation  |timestamp           |params                                                    
+---------+-----------+--------------------+-------------------------------------------------------------------------------------------------------------------------+
|profile  |CREATE_CARD|2020-02-24 03:07:04 |[50d966f2-2820-441a-afbe-851e45eeb13e, 1s9miu7t6an50fplvvhybow6edx9_STG, 993270335, CREATED_CARD, 8236961209881953, kobo]|
|profile  |UPDATE     |2020-02-12 18:13:08 |[0792b8d1-7ad9-43fc-9e75-9b1f2612834c, rkm9a7mescuwp0s4i01zlwi2ftu9_STG, 993270329, primary_email]|
|member   |CREATE     |2020-01-02 09:51:32 |[ea8e7e39-4a0a-4d41-b47e-70c8e56a2bca, h4m015wf1qxwrogj6d9l2uc5bsa9_STG, 993270331]

1 Ответ

0 голосов
/ 02 апреля 2020

Вы можете использовать "unionByName" (из 2.3) https://spark.apache.org/docs/latest/api/python/_modules/pyspark/sql/dataframe.html

как:

from functools import reduce
from pyspark.sql import DataFrame

dfs = [df1, df2, df3]
df = reduce(DataFrame.unionByName, dfs)

Если у вас версия Spark ниже 2.3, вы можете используйте «союз», но остерегайтесь порядка столбцов.

...