【问题标题】:Hive: parsing JSONHive:解析 JSON
【发布时间】:2012-09-28 18:44:19
【问题描述】:

我正在尝试从数百万行(5 TB+ 表)的嵌套 JSON 中获取一些值。最有效的方法是什么?

这是一个例子:

{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}}

我需要上述 JSON 中的这些值:

Country        Page      impressions_s       impressions_o
---------      -----     -------------       --------------
US              2        10                  10

这是 Hive 的 json_tuple 函数,我不确定这是否是最好的函数。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-getjsonobject

【问题讨论】:

    标签: json hadoop hive


    【解决方案1】:

    你可以使用get_json_object:

     select get_json_object(fieldname, '$.country'), 
            get_json_object(fieldname, '$.data.ad.s') from ... 
    

    使用 json_tuple 可以获得更好的性能,但我发现了一个“如何”在 json 中获取 json 中的值; 要格式化您的表格,您可以使用以下内容:

    from table t lateral view explode( split(regexp_replace(get_json_object(ln, ''$.data.ad.s'), '\\[|\\]', ''), ',' ) ) tb1 as s 上面的这段代码将把你变成一个列中的“数组”。

    表格更多:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

    希望对你有所帮助...

    【讨论】:

      【解决方案2】:

      这是你可以快速尝试的,我建议使用Json-Ser-De

      纳米/tmp/hive-parsing-json.json

      {"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}}
      

      创建基表:

      hive > CREATE TABLE hive_parsing_json_table ( json string );
      

      将 json 文件加载到表中:

      hive > LOAD DATA LOCAL INPATH  '/tmp/hive-parsing-json.json' INTO TABLE hive_parsing_json_table;
      

      查询表:

      hive >  select v1.Country, v1.Page, v4.impressions_s, v4.impressions_o 
      from hive_parsing_json_table hpjp
           LATERAL VIEW json_tuple(hpjp.json, 'country', 'page', 'data') v1
           as Country, Page, data
           LATERAL VIEW json_tuple(v1.data, 'ad') v2
           as Ad
           LATERAL VIEW json_tuple(v2.Ad, 'impressions') v3
           as Impressions
           LATERAL VIEW json_tuple(v3.Impressions, 's' , 'o') v4
           as impressions_s,impressions_o;  
      

      输出:

      v1.country  v1.page     v4.impressions_s    v4.impressions_o
      US      227     10          10
      

      【讨论】:

      • 作为记录(我没有看到这个记录),如果你将LATERAL VIEW 语句与连接(例如INNER JOIN)结合起来,连接必须在横向视图之前(语法上)
      【解决方案3】:

      使用 hive native json-serde('org.apache.hive.hcatalog.data.JsonSerDe') 你可以做到这一点.. 这里是步骤

      添加 JAR /path/to/hive-hcatalog-core.jar;

      create a table as below 
       CREATE TABLE json_serde_nestedjson (
        country string,
        page int,
        data struct < ad: struct < impressions: struct < s:int, o:int  > > >
      )
      ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';
      

      然后加载数据(存储在文件中)

      LOAD DATA LOCAL INPATH '/tmp/nested.json' INTO TABLE json_serde_nestedjson;
      

      然后使用

      获取所需数据
      SELECT country, page, data.ad.impressions.s, data.ad.impressions.o 
      FROM json_serde_nestedjson;  
      

      【讨论】:

        【解决方案4】:

        实施 SerDe 以解析 JSON 格式的数据是适合您的情况的更好方法。

        可以在此处找到有关如何实现 SerDe 以解析 JSON 的教程

        http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/

        您也可以使用以下示例 SerDe 实现

        https://github.com/rcongiu/Hive-JSON-Serde

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-06
          • 1970-01-01
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多