Как реляционизировать массивы, содержащие JSON - PullRequest
0 голосов
/ 20 марта 2019

Я использую AWS Glue для чтения файла данных, содержащего JSON (на S3). Это JSON с данными, содержащимися в массиве. Я пытался использовать функциюlationalize (), но она не работает с массивом. Он работает на вложенном JSON, но это не формат ввода данных.

Есть ли способ связать JSON с массивами в нем?

Входные данные:

{
    "ID":"1234",
    "territory":"US",
    "imgList":[
        {
            "type":"box"
            "locale":"en-US"
            "url":"boxart/url.jpg"
        },
        {
            "type":"square"
            "locale":"en-US"
            "url":"square/url.jpg"
        }
    ]
}

Код:

dfc = Relationalize.apply(frame = datasource0, staging_path = glue_temp_storage, name = "root", transformation_ctx = "dfc")
dfc.select('root').toDF().show()

Выход:

+----+----------+--------+
|ID  |territory |imgList |
+----+----------+--------+
|1234|       US |       1|
+----+----------+--------+

Желаемый вывод:

+----+----------+-------------+---------------+---------------+
|ID  |territory |imgList.type |imgList.locale |imgList.url    |
+----+----------+-------------+---------------+---------------+
|1234|       US |       box   |         en-US |boxart/url.jpg |
+----+----------+-------------+---------------+---------------+
|1234|       US |       square|         en-US |square/url.jpg |
+----+----------+-------------+---------------+---------------+

1 Ответ

2 голосов
/ 20 марта 2019

Relationalize создает DynamicFrames для каждого массива в документе JSON.Так что вам просто нужно получить его и присоединиться к корневой таблице:

dfc = Relationalize.apply(frame = datasource0, staging_path = glue_temp_storage, name = "root", transformation_ctx = "dfc")
root_df = dfc.select('root')
imgList_df = dfc.select('root_imgList')

df = Join.apply(root_df, imgList_df, 'imgList', 'id')
df.toDF().show()
...