Как извлечь данные из определенных полей в формате NESTED JSON с помощью AWS Athena - Presto? - PullRequest
0 голосов
/ 03 марта 2019

У меня есть JSON в указанном ниже формате в корзине S3, и я пытаюсь извлечь только "id", "label" & "value" из ключа "fields" с помощью Athena.Я попробовал ARRAY-MAP, но безуспешно.Кроме того, в поле «значение» - я хочу, чтобы содержимое было записано в виде простого текста, игнорируя любой список / словари в нем.

Я также не хочу создавать схемы Hive для этих JSON и, если возможно, ищу решение Presto SQL.

{  
    "reports":{  
        "client":{  
            "pdf":"https://reports.s3-accelerate.amazonaws.com/looks/123/reports/client.pdf",
            "html":"https://api.com/looks/123/reports/client.html"
        },
        "public":{  
            "pdf":"https://s3.amazonaws.com/reports.com/looks/123/reports/public.pdf",
            "html":"https://api.look.com/looks/123/reports/public.html"
        }
    },
    "actors":{  
        "looker":{  
            "firstName":"Rosa",
            "lastName":"Mart"
        },
        "client":{  
            "email":"XXX.XXX@XXXXXX.com",
            "firstName":"XXX",
            "lastName":"XXX"
        }
    },
    "_id":"123",
    "fields":[  
                {  
        "id":"fence_condition_missing_sections",
        "context":[  
            "Fence Condition"
        ],
        "label":"Missing Sections",
        "type":"choice",
        "value":"None"
    },
        {  
            "id":"photos_landscaped_area",
            "context":[  
                "Landscaping Photos"
            ],
            "label":"Landscaped Area",
            "type":"photo-with-description",
            "value":[  
                {  
                    "description":"Front",
                    "photo":"https://reports-wegolook-com.s3-accelerate.amazonaws.com/looks/123/looker/1.jpg"
                },
                {  
                    "description":"Front entrance ",
                    "photo":"https://reports-wegolook-com.s3-accelerate.amazonaws.com/looks/123/looker/2.jpg"
                }
            ]
        }
    ],
    "jobNumber":"xxx",
    "createdAt":"2018-10-11T22:39:37.223Z",
    "completedAt":"2018-01-27T20:13:49.937Z",
    "inspectedAt":"2018-01-21T23:33:48.718Z",
    "type":"ZZZ-commercial",
    "name":"Commercial"
}'

ожидаемый вывод:

--------------------------------------------------------------------------------
| ID     | LABEL |  VALUE                                                  | 
--------------------------------------------------------------------------------
|   photos_landscaped_area     |  Landscaped Area |  [{"description":"Front",...}]    |
----------------------------------------------------------------------------
| fence_condition_missing_sections | Missing Sections | None|
----------------------------------------------------------------------------

1 Ответ

0 голосов
/ 06 марта 2019

Я собираюсь предположить, что ваши данные представлены в формате «один документ на строку», и что вы предоставили отформатированный пример для удобства чтения.Если это неверно, см. Вопрос Запрос многострочного файла JSON в кусте .

Если схема документа JSON не совсем регулярна, вы можете создать этот столбец как * 1005.* столбец и используйте функции JSON_* для извлечения значений из него.

Сначала вам нужно создать таблицу для необработанных данных:

CREATE TABLE data (
  fields array<struct<id:string,label:string,value:string>>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://…'

(если вас это не интересует)в других полях документов JSON вы можете просто игнорировать их при создании таблицы)

Затем вы создаете представление, которое выравнивает данные:

CREATE VIEW flat_data AS
SELECT
  field.id,
  field.label,
  field.value
FROM data
CROSS JOIN UNNEST(fields) AS f(field)

Выбор из этого представления должен дать вамрезультаты, которые вы ищете.

Я подозреваю, что вы также ищете, как извлечь свойства из структуры values, о чем я упоминал выше:

SELECT
  label,
  JSON_EXTRACT(value, '$.photo') AS photo_urls
FROM flat_data
WHERE id = 'photos_landscaped_area'

Посмотрите надокументация Presto для всех доступных функций JSON .

...