【问题标题】:Extracting an Array of Structs in Hive在 Hive 中提取结构数组
【发布时间】:2013-03-15 18:33:09
【问题描述】:

我在 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 回答了这个问题,但我遇到了另外 2 个问题。在这个SO Question

【问题讨论】:

    标签: hadoop hive hiveql


    【解决方案1】:

    一种方法是使用inlineexplode 函数,如下所示:

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

    否则你可以写 UDF。请查看this postthis post。连同以下资源:

    【讨论】:

      【解决方案2】:

      您可以使用 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 列表:

      项目 [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

      【讨论】:

        【解决方案3】:

        如果数组的大小是固定的(比如 2 )。请尝试:

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

        但如果不是,UDF 应该是正确的解决方案。我想你可以在 JRuby 中做到这一点。 GL!

        【讨论】:

        • 谢谢,但数组的大小不固定。虽然使用 JRuby 是个好主意,但为此,需要使用 Java 来编写 GenericUDF。更糟糕的是,写GenericUDF没有太多参考。
        猜你喜欢
        • 2012-07-07
        • 2018-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多