2013-03-26 3 views
5

У меня есть внешняя таблица в улейРаспаковка массив структур в улье

CREATE EXTERNAL TABLE FOO ( 
    TS string, 
    customerId string, 
    products array< struct <productCategory:string, productId:string> > 
) 
PARTITIONED BY (ds string) 
ROW FORMAT SERDE 'some.serde' 
WITH SERDEPROPERTIES ('error.ignore'='true') 
LOCATION 'some_locations' 
; 

A записи таблицы могут содержать данные, такие как:

1340321132000, 'some_company', [{"productCategory":"footwear","productId":"nik3756"},{"productCategory":"eyewear","productId":"oak2449"}] 

ли кто-нибудь знает, если есть способ просто извлечь всю товарную категорию из этой записи и вернуть ее в виде массива productCategories без использования explode. Что-то вроде следующего:

["footwear", "eyewear"] 

Или мне нужно, чтобы написать мой собственный GenericUDF, если это так, я не знаю много Java (человек на Ruby), может кто-нибудь дать мне несколько советов? Я прочитал несколько инструкций по UDF из Apache Hive. Однако я не знаю, какой тип коллекции лучше всего обрабатывать массив, и какой тип коллекции обрабатывать структуры?

===

я несколько ответил на этот вопрос, написав GenericUDF, но я столкнулся с 2 другими проблемами. Именно в этом SO Question

ответ

0

Если размер массива фиксирован (например, 2). Попробуйте:

products[0].productCategory,products[1].productCategory 

Но если нет, UDF должен быть правильным решением. Думаю, вы могли бы сделать это в JRuby. GL!

+0

Спасибо, но размер массива не фиксируется. Хотя хорошая идея использовать JRuby, для этого нужно использовать Java для написания GenericUDF. Хуже того, в письменной форме GenericUDF не так много ссылок. – pchu

0

Один из способов будет использовать либо inlineexplode или функции, например, так:

SELECT 
    TS, 
    customerId, 
    pCat, 
    pId, 
FROM FOO 
LATERAL VIEW inline(products) p AS pCat, pId 

В противном случае вы можете написать UDF. Отъезд this post и this post для этого. Наряду со следующими ресурсами:

0

Вы можете использовать JSon serde или встроенные функции get_json_object, json_tuple.

С rcongiu's Hive-JSON SerDe использование будет:

определить таблицу:

CREATE TABLE complex_json (
DocId string, 
Orders array<struct<ItemId:int, OrderDate:string>>) 

нагрузки образец JSON в него (это важно для этих данных, чтобы быть один подкладка):

{"DocId":"ABC","Orders":[{"ItemId":1111,"OrderDate":"11/11/2012"},{"ItemId":2222,"OrderDate":"12/12/2012"}]} 

Затем выборки заказов указаны так же легко:

SELECT Orders.ItemId FROM complex_json LIMIT 100; 

Она возвращает список идентификаторов для вас:

Itemid [1111,2222]

Проверенных возвращать правильные результаты на моем окружении. Полный список:

add jar hdfs:///tmp/json-serde-1.3.6.jar; 

CREATE TABLE complex_json (
    DocId string, 
    Orders array<struct<ItemId:int, OrderDate:string>> 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'; 

LOAD DATA INPATH '/tmp/test.json' OVERWRITE INTO TABLE complex_json; 

SELECT Orders.ItemId FROM complex_json LIMIT 100; 

Подробнее здесь:

http://thornydev.blogspot.com/2013/07/querying-json-records-via-hive.html