6

ハイブに外部テーブルがあります

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 を単純に抽出し、explode を使用せずに productCategories の配列として返す方法があるかどうかは誰にもわかりません。次のようなもの:

["footwear", "eyewear"] 

それとも、独自の GenericUDF を作成する必要がありますか? もしそうなら、私は Java (Ruby の人) をあまり知りません。誰かヒントを教えてもらえますか? Apache Hive から UDF に関する説明を読みました。しかし、どのコレクション型が配列を処理するのに最適で、どのコレクション型が構造体を処理するのに最適なのかわかりません。

===

GenericUDF を作成することでこの質問にある程度答えましたが、他に 2 つの問題が発生しました。それはこのSOの質問にあります

4

3 に答える 3

1

json serde または組み込み関数 get_json_object、json_tuple を使用できます。

rcongiuの Hive-JSON SerDeを使用すると、次のように使用されます。

テーブルを定義します:

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

サンプル json をロードします (このデータを 1 行にすることが重要です)。

{"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

于 2016-02-29T16:04:03.850 に答える
1

1 つの方法は、次のようにinlineまたはexplode関数を使用することです。

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

それ以外の場合は、UDF を記述できます。それについては、この投稿この投稿を確認してください。以下のリソースとともに:

于 2016-02-29T01:39:24.403 に答える
0

配列のサイズが固定されている場合 ( 2 など)。してみてください:

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

そうでない場合は、UDF が適切なソリューションです。JRubyでできると思います。GL!

于 2013-03-26T07:20:21.363 に答える