У меня есть данные 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, так что пары ключ-значение могут быть извлечены