HiveSQL доступ к значениям JSON-массива - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть таблица в 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';

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

enter image description here

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

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

Какмогу ли я получить доступ к данным в моем столбце цвета с помощью select?

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

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

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

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

Создать правильную таблицу 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

0 голосов
/ 07 декабря 2018

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

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';

таким образом, чтобы вы могли иметь структуру, которую он сам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...