我在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'
;
该表的记录可能包含以下数据:
1340321132000, 'some_company', [{"productCategory":"footwear","productId":"nik3756"},{"productCategory":"eyewear","productId":"oak2449"}]
有人知道是否有办法简单地从此记录中提取所有productCategory并将其作为productCategories数组返回,而不使用explode。如下所示:
["footwear", "eyewear"]
或者我是否需要编写自己的GenericUDF,如果是这样,我不太了解Java(一个Ruby人),有人可以给我一些提示吗?我从Apache Hive读了一些关于UDF的说明。但是,我不知道哪种集合类型最适合处理数组,以及处理结构的集合类型是什么?
===
我通过编写GenericUDF来回答这个问题,但我遇到了另外两个问题。它在SO Question
中答案 0 :(得分:1)
你可以使用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"}]}
然后获取订单ID就像:
SELECT Orders.ItemId FROM complex_json LIMIT 100;
它将为您返回ID列表:
的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
答案 1 :(得分:0)
如果数组的大小是固定的(如2)。请尝试:
products[0].productCategory,products[1].productCategory
但如果没有,UDF应该是正确的解决方案。我想你可以在JRuby中做到这一点。 GL!
答案 2 :(得分:0)
一种方法是使用inline
或explode
函数,如下所示:
SELECT
TS,
customerId,
pCat,
pId,
FROM FOO
LATERAL VIEW inline(products) p AS pCat, pId