2013-03-26 5 views
5

Extrahierung habe ich eine externe Tabelle in hiveein Array von Strukturen in Hive

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

eine Aufzeichnung der Tabelle können Daten wie halten:

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

Sie jemand wissen, ob es einen Weg gibt Einfach die gesamte ProductCategory aus diesem Datensatz extrahieren und als Array von productCategories zurückgeben, ohne explode zu verwenden. Etwas wie folgt aus:

["footwear", "eyewear"] 

Oder muss ich schreibe meine eigenen GenericUDF, wenn ja, ich weiß nicht viel Java (ein Ruby-Person), kann mir jemand ein paar Tips? Ich habe einige Anweisungen zu UDF von Apache Hive gelesen. Ich weiß jedoch nicht, welcher Sammlungstyp am besten mit array umgehen kann und welcher Sammlungstyp für die Handhabung von Strukturen.

===

ich diese Frage etwas beantwortet durch eine GenericUDF zu schreiben, aber ich lief in zwei andere Probleme. Es ist in diesem SO Question

Antwort

0

Wenn die Größe des Arrays fest ist (wie 2). Bitte versuchen:

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

Aber wenn nicht, sollte UDF die richtige Lösung sein. Ich schätze, dass du es in JRuby machen könntest. GL!

+0

Danke, aber die Größe des Arrays ist nicht festgelegt. Obwohl es eine gute Idee ist, JRuby zu verwenden, müssen Sie Java verwenden, um GenericUDF zu schreiben. Schlimmer noch, es gibt nicht viel Bezug in GenericUDF. – pchu

0

können Sie json serde verwenden oder build-in Funktionen get_json_object, json_tuple.

Mit rcongiu's Hive-JSON SerDe wird die Nutzung sein:

definieren Tabelle:

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

Belastungsprobe json in sie (es ist wichtig für diese Daten einem ausgekleideten sein):

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

Dann ist das Abrufen von Bestellungen ids so einfach wie:

SELECT Orders.ItemId FROM complex_json LIMIT 100; 

Es wird die Liste der IDs für Sie zurück:

itemid [1111,2222]

Bewährte korrekte Ergebnisse auf meine Umgebung zurückzukehren. Vollständige Auflistung:

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; 

Lesen Sie mehr hier:

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