Как анализировать JSON в Hive со значениями Mixed Struct/String для одного поля?

У меня есть данные JSON, структура которых аналогична этой:

root
 |-- TX: struct (nullable = true)
 |    |-- ARGS: array (nullable = true)
 |    |    |-- element: string (containsNull = true)
 |    |-- COOKIE: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- name: string (nullable = true)
 |    |    |    |-- value: string (nullable = true)

Формат данных на самом деле состоит в том, что массив ARGS содержит структуры (пару "имя-значение", как и массив COOKIE), например:

ARGS: {"name": "url", "value": "/index.html"}

Однако в некоторых строках файла массив ARGS содержит только нулевое значение, что заставляет Hive интерпретировать его как строку:

ARGS: null

Поскольку я знаю, что все ненулевые значения в ARGS являются структурами, я использую оператор CREATE в Hive следующим образом:

CREATE EXTERNAL TABLE ${db}.${table}(
    tx struct<
        args:array<struct<name:string,value:string>>,
        cookie:array<struct<name:string,value:string>>
    >
) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION '${uri}';

Поскольку конечной целью здесь является латерализация массива пар ключ-значение, я использую такой запрос для проверки:

SELECT array_pairs.name, array_pairs.value 
FROM ${db}.${table}
LATERAL VIEW EXPLODE(tx.args) EXPLODED_TABLE AS array_pairs;

Это отлично работает, если я просто просматриваю первые 100 или около того строк в Hue. Но если я попытаюсь экспортировать его как CSV или использовать предложение WHERE, которое считывает всю таблицу, Hive выдает эту ошибку из-за несоответствия типа данных:

errorMessage='java.lang.Error: Data is not JSONObject but java.lang.String with value alpha'

Я знаю, что лучший ответ — иметь идеальный источник данных, но в данном случае данные — это то, что есть, и мне нужно их проанализировать. Любые советы о том, как работать с нулевыми значениями в JSON с разбором Hive?

ИЗМЕНИТЬ 24.10.2019 07:43

Благодаря @leftjoin я понял, что помимо нулевых значений есть один или два объекта JSON, где поле ARGS заполняется одной строкой в ​​массиве:

ARGS: ["string value"]

Учитывая это, есть ли способ игнорировать эти строки синтаксическим анализатором Hive, чтобы можно было извлечь пары ключ-значение?


person nxl4    schedule 23.10.2019    source источник
comment
Это не из-за нулей. Проверяйте литералы вместо структур   -  person leftjoin    schedule 24.10.2019
comment
Дарн, ты прав. Я добавил редактирование с новой информацией.   -  person nxl4    schedule 24.10.2019


Ответы (1)


Попробуйте установить свойство SerDe, чтобы игнорировать искаженный JSON:

ALTER TABLE json_table SET SERDEPROPERTIES ( "ignore.malformed.json" = "true");
person leftjoin    schedule 24.10.2019
comment
К сожалению, это приводит к той же ошибке запроса после изменения структуры таблицы. - person nxl4; 24.10.2019