2014-07-08 4 views
0

Мы изучаем, позволяет ли Hive запускать SQL-запросы на динамическую схему стиля mongo в качестве предшественника наших сокращений на карте.Создание таблицы улья для динамических схем

Данные поступают в виде нескольких файлов TiB BSON; каждый из файлов содержит JSON «образцы». Пример выборки приведен в качестве таковых:

{ 
    "_id" : "SomeGUID", 
    "SomeScanner" : 
    { 
     "B64LR" : 22, 
     "Version" : 192565886128245 
     }, 
     "Parser" : 
     { 
      "Size" : 73728, 
      "Headers" : 
      [ 
       { 
        "VAddr" : 4096, 
        "VSize" : 7924.     
. . . etc. . . . 

В динамической схеме, лишь немногие из полей гарантированно существует.

Мы хотели бы, чтобы иметь возможность выполнить запрос от входного набора, который может быть что-то вроде

SomeScanner.Parser.Headers.VSize > 9000 

Посмотрев вверх таблицы картографии, я не уверен, является ли выполнимо с Улей. , , как бы отобразить столбец, который может или не может быть там. , , не говоря уже о том, что в типичном образце имеется примерно 2k-3k запросов.

Следовательно, мои вопросы к экспертам:

  • Может Hive построить динамическую схему из данных, которые он встречает?
  • Как можно построить таблицу улья с ~ 3k столбцами?
  • Есть ли лучший способ?

Оценка, как всегда.

ответ

2

ОК - с большим количеством шума, теперь я могу ответить на свои вопросы.

  • Может ли Hive построить динамическую схему из данных, с которыми она сталкивается? A: Нет. Однако отличный инструмент для этого существует. q.v., инф.

  • Как можно идти о создании таблицы улей ж/~ 3K столбцов A: Там же

  • Есть ли лучший способ? A: Не то, чтобы я нашел; но, с некоторой помощью, это не слишком сложно.

Во-первых, крик Майкла Петерсона в http://thornydev.blogspot.com/2013/07/querying-json-records-via-hive.html, чей блог пост служил схождения трюм, чтобы понять все это.

Определенно проверьте это, если вы начинаете w/Hive.

Теперь улей не может импортировать документ JSON и выводить из него схему. , , Майкл Петерсон разработал инструмент, который делает следующее: https://github.com/midpeter444/hive-json-schema

Некоторые оговорки: * Пустые массивы и структуры не обрабатываются, поэтому удаляйте их (или заполняйте). В противном случае такие вещи, как { "something" : {} } или {"somethingelse": []}, будут выдавать ошибки.

  • Если какое-либо поле имеет имя «функция», оно должно быть переименовано до выполнения инструкции CREATE TABLE. Например., Следующий код выдаст ошибку: 1 { "что-то": { "thisIsOK": "истина", "функция": "thatThrowsAnError"}} `

Предположительно, это происходит потому, что "function" является ключевым словом улей ,

  • И, с динамической схемой в целом, я не нашел способ справиться с вложенным подчеркиванием имени, даже если схема действует: { "somethings": { "_someVal": "123", "otherVal": "456" } } потерпит неудачу.

  • Для общего поля «ID» MongoDB это возможно на карте с добавлением: with serdeproperties("mapping.id" = "_id"), которое похоже на макроподстановку.

Сериализация/Де-Сериализация для JSON может быть достигнута с https://github.com/rcongiu/Hive-JSON-Serde путем добавления следующие: ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'

N.B., JsonSerDe JAR, должно быть, был добавлен в .hiverc или «добавить jar» в dive для использования.
Таким образом, схема:

CREATE TABLE samplesJSON 
    (id string, 
     . . . rest of huge schema . . . .) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH serdeproperties("mapping.id" = "_id"); 

Данные JSON могут быть загружены в таблицу с помощью команды по линиям:

LOAD DATA LOCAL INPATH '/tmp/samples.json' OVERWRITE INTO TABLE samplesJSON; 

Наконец, запросы на самом деле интуитивно прямо вперед. Используя приведенный выше пример с оригинального вопроса:

hive> select id, somescanner.parser.headers.vaddr from samplesjson; 
OK 
id vaddr 
119 [4096,53248,57344] 
Смежные вопросы