Значения JSON-массива HiveSQL

77
7

У меня есть таблица в Hive, которая генерируется чтением из файла последовательности в моей HDFS. Эти файлы последовательности являются json и выглядят так:

{"Activity":"Started","CustomerName":"CustomerName3","DeviceID":"StationRoboter","OrderID":"CustomerOrderID3","DateTime":"2018-11-27T12:56:47Z+0100","Color":[{"Name":"red","Amount":1},{"Name":"green","Amount":1},{"Name":"blue","Amount":1}],"BrickTotalAmount":3}

Они представляют цвета деталей продукта и их количество, которое учитывается в одном прогоне процесса обслуживания.

Пожалуйста, обратите внимание на JSON-массив в цвете

Поэтому мой код для создания таблицы:

CREATE EXTERNAL TABLE iotdata(
activity STRING,
customername STRING,
deviceid STRING,
orderid STRING,
datetime STRING,
color ARRAY<MAP<String,String>>,
bricktotalamount STRING
)
ROW FORMAT SERDE "org.apache.hive.hcatalog.data.JsonSerDe"
STORED AS
INPUTFORMAT 'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'
LOCATION '/IoTData/scray-data-000-v0';

Это работает, и если я делаю select * для этой таблицы, это выглядит так:

enter image description here

Но моя проблема в том, что я должен получить доступ к данным внутри цветного столбца для анализа. Например, я хочу вычислить все красные значения в таблице.

Таким образом, это приводит к нескольким возможностям и вопросам: как я могу привести полученную строку суммы к целому числу?

Как я могу получить доступ к данным в моей колонке цветов через select?

Или есть возможность изменить мою схему таблицы в самом начале, чтобы получить 4 дополнительных столбца для моих 4 цветов и 4 дополнительных столбца для соответствующего количества цветов?

Я также попытался прочитать весь json как строку в один столбец и выбрать там подконтент, но этот импорт массива json в куст приводит меня только к значениям NULL, вероятно, потому что мой файл json не на 100% правильно сформирован.

спросил(а) 2021-01-25T12:20:38+03:00 4 месяца, 2 недели назад
1
Решение
109

Вы можете сделать это в два этапа.

Создайте надлежащую таблицу JSON

CREATE external TABLE temp.test_json (
activity string,
bricktotalamount int,
color array<struct<amount:int, name:string>>,
customername string,
datetime string,
deviceid string,
orderid string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
location '/tmp/test_json/table'

enter image description here

Взорвать таблицу в инструкции выбора

select activity, bricktotalamount, customername, datetime, deviceid, orderid, name, amount from temp.test_json
lateral view inline(color) c as amount,name

enter image description here

ответил(а) 2021-01-25T12:20:38+03:00 4 месяца, 2 недели назад
45

Данные внутри вашего массива определенно не являются картой для улья, вам нужно указать. Я бы рекомендовал переопределить таблицу, указав структуру данных массива, как это

CREATE EXTERNAL TABLE iotdata(
activity STRING,
customername STRING,
deviceid STRING,
orderid STRING,
datetime STRING,
color ARRAY<STRUCT<NAME: STRING,AMOUNT:BIGINT>>
bricktotalamount STRING
)
ROW FORMAT SERDE "org.apache.hive.hcatalog.data.JsonSerDe"
STORED AS
INPUTFORMAT 'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'
LOCATION '/IoTData/scray-data-000-v0';

таким образом, вы должны иметь возможность создать структуру

ответил(а) 2021-01-25T12:20:38+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема