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

У меня есть данные 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или около того строк в Хюэ. Но если я пытаюсь экспортировать его как CSV или использовать предложение WHERE, которое читает всю таблицу, Hive выдает эту ошибку из-за несоответствия типов данных:

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

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

РЕДАКТИРОВАТЬ 24.10.2009 07: 43

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

ARGS: ["string value"]

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

1 Ответ

0 голосов
/ 24 октября 2019

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

ALTER TABLE json_table SET SERDEPROPERTIES ( "ignore.malformed.json" = "true");
...