Hive:解析JSON

26

我正在尝试从嵌套的JSON中获取一些值,表格包含500万行(5TB+)。如何以最有效的方式进行操作?

以下是一个示例:

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

4个回答

26
您可以使用 get_json_object:
 select get_json_object(fieldname, '$.country'), 
        get_json_object(fieldname, '$.data.ad.s') from ... 

您可以使用json_tuple获得更好的性能,但我找到了一个“如何”在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 希望这有所帮助...

你是一次性奇迹(给出了好的答案,然后就消失了)。随时欢迎回来,在SOF上加入我们的乐趣。 - WestCoastProjects

8

以下是您可以快速尝试的方法,建议使用Json-Ser-De

nano /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)结合使用,那么连接必须在LATERAL VIEW之前(从语法上来说)。 - MichaelChirico

5

使用Hive本地的json-serde('org.apache.hive.hcatalog.data.JsonSerDe'),您可以执行以下操作...以下是步骤:

ADD 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;  

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接