我试图从数百万行(5 TB +表)的嵌套JSON中获取一些值.最有效的方法是什么?
这是一个例子:
{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}}
Run Code Online (Sandbox Code Playgroud)
我需要以上JSON中的这些值:
Country Page impressions_s impressions_o
--------- ----- ------------- --------------
US 2 10 10
Run Code Online (Sandbox Code Playgroud)
这是Hive的json_tuple函数,我不确定这是否是最好的函数. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-getjsonobject
小智 13
你可以使用get_json_object:
select get_json_object(fieldname, '$.country'),
get_json_object(fieldname, '$.data.ad.s') from ...
Run Code Online (Sandbox Code Playgroud)
使用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
我希望这有帮助......
这是你可以快速尝试的,我建议使用Json-Ser-De.
nano /tmp/hive-parsing-json.json
{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}}
Run Code Online (Sandbox Code Playgroud)
创建基表:
hive > CREATE TABLE hive_parsing_json_table ( json string );
Run Code Online (Sandbox Code Playgroud)
将json文件加载到Table:
hive > LOAD DATA LOCAL INPATH '/tmp/hive-parsing-json.json' INTO TABLE hive_parsing_json_table;
Run Code Online (Sandbox Code Playgroud)
查询表格:
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;
Run Code Online (Sandbox Code Playgroud)
输出:
v1.country v1.page v4.impressions_s v4.impressions_o
US 227 10 10
Run Code Online (Sandbox Code Playgroud)
小智 5
使用蜂巢本机 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';
Run Code Online (Sandbox Code Playgroud)
然后加载数据(存储在文件中)
LOAD DATA LOCAL INPATH '/tmp/nested.json' INTO TABLE json_serde_nestedjson;
Run Code Online (Sandbox Code Playgroud)
然后使用获取所需数据
SELECT country, page, data.ad.impressions.s, data.ad.impressions.o
FROM json_serde_nestedjson;
Run Code Online (Sandbox Code Playgroud)
小智 1
对于您的情况,实现 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
| 归档时间: |
|
| 查看次数: |
37404 次 |
| 最近记录: |