2013-03-26 46 views
5

Tôi có một bảng bên ngoài trong hiveTrích xuất một mảng của cấu trúc trong 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' 
; 

Một kỷ lục của bảng có thể chứa dữ liệu như:

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

Đừng ai biết nếu có một cách chỉ cần trích xuất tất cả productCategory từ bản ghi này và trả về nó như là một mảng của productCategories mà không cần sử dụng phát nổ. Một cái gì đó như sau:

["footwear", "eyewear"] 

Hoặc tôi cần viết GenericUDF của riêng mình, nếu có, tôi không biết nhiều Java (người Ruby), ai đó có thể cho tôi một số gợi ý không? Tôi đã đọc một số hướng dẫn về UDF từ Apache Hive. Tuy nhiên, tôi không biết loại bộ sưu tập nào là tốt nhất để xử lý mảng và loại bộ sưu tập nào để xử lý cấu trúc?

===

Tôi đã trả lời câu hỏi này bằng cách viết GenericUDF, nhưng tôi đã gặp phải 2 vấn đề khác. Chính trong số này là SO Question

Trả lời

0

Nếu kích thước của mảng cố định (như 2). Vui lòng thử:

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

Nhưng nếu không, UDF phải là giải pháp phù hợp. Tôi đoán rằng bạn có thể làm điều đó trong JRuby. GL!

+0

Cảm ơn, nhưng kích thước của mảng không cố định. Trong khi ý tưởng tốt để sử dụng JRuby, cho điều này, cần phải sử dụng Java để viết GenericUDF. Tệ hơn nữa, không có nhiều tài liệu tham khảo bằng văn bản GenericUDF. – pchu

0

Bạn có thể sử dụng json serde hoặc xây dựng-in chức năng get_json_object, json_tuple.

Với rcongiu's Hive-JSON SerDe việc sử dụng sẽ là:

xác định bảng:

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

tải mẫu json vào nó (điều quan trọng là cho dữ liệu này là một trong lót):

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

Sau đó tìm nạp id đơn đặt hàng dễ dàng như:

SELECT Orders.ItemId FROM complex_json LIMIT 100; 

Nó sẽ trả lại danh sách các id cho bạn:

ItemID [1111,2222]

đã được chứng minh để đưa ra kết quả chính xác về môi trường của tôi. Full niêm yết:

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; 

đọc thêm ở đây:

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

Các vấn đề liên quan