hive如何使用json格式的数据

本文详细介绍Hive中处理JSON数据的两种主要方法:使用get_json_object和json_tuple函数逐个解析字段,以及利用hive-json-serde进行整体解析。文章对比了不同方法的优劣,并提供了实用案例。
  1. 查看当前hive支持的json函数
show functions like "*json*";
OK
get_json_object
json_tuple
Time taken: 0.006 seconds, Fetched: 2 row(s)
  • get_json_object
 describe function get_json_object;
 OK
 get_json_object(json_txt, path) - Extract a json object from path 

解析json的字符串json_txt,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
例如:

select  get_json_object('{"store":{"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}}, "email":"amy@only_for_json_udf_test.net","owner":"amy" } ','$.ownes');
OK
NULL
Time taken: 0.219 seconds, Fetched: 1 row(s)

没有ownes,返回值是null

select  get_json_object('{"store":{"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}}, "email":"amy@only_for_json_udf_test.net","owner":"amy" } ','$.owner');
OK
amy

通过$.获取对应key的value 值

select  get_json_object('{"store":{"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}}, "email":"amy@only_for_json_udf_test.net","owner":"amy" } ','$.store.fruit');
OK
[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}]
select  get_json_object('{"store":{"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}}, "email":"amy@only_for_json_udf_test.net","owner":"amy" } ','$.store.fruit.weight');
OK
[8,9]

效果如上,如果是嵌套json,也通过.获取,如果并列结构获取的值将是list的形式

  • json_tuple
desc function json_tuple;
OK
json_tuple(jsonStr, p1, p2, ..., pn) - like get_json_object, but it takes multiple names and return a tuple. All the input parameters and output column types are string.

参数为一组键p1,p2……和JSON字符串,返回值的元组。该方法可以在一次调用中输入多个键

select json_tuple('{"store":{"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}}, "email":"amy@only_for_json_udf_test.net","owner":"amy" }',"store","email","owner")
OK
{"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}}      amy@only_for_json_udf_test.net  amy

可以通过 “store”,“email”,“owner” 获取三个key 对应的value值,相比get_json_object显得更为高效率

select json_tuple('{"store":{"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}}, "email":"amy@only_for_json_udf_test.net","owner":"amy" }',"store.fruit","email","owner")
               > ;
OK
NULL    amy@only_for_json_udf_test.net  amy

可以看出。不能通过.获取件套数据对应的值,如果key不存在,将返回null。

要获取json各列的数据的方法

raw001	{"age":20,"gender":"M","weight":"56"}  
raw002	{"age":23,"gender":"M","weight":"70"}  
raw003	{"age":34,"gender":"F","weight":"50"} 

---------------------

select t.cl1 , get_json_object(t.cl2json,'$.age'), get_json_object(t.cl2json,'$.gender') from tmp_json_test t ; 
select t1.cl1, t2.* from tmp_json_test t1 lateral view json_tuple(t1.cl2json, 'age', 'gender') t2 as c1, c2; 

上面这种方式不能处理复杂类型(如果hive表中字段为array,map等),并且处理上非常麻烦,要写好长的sql。
还有一种对于数据是整个json格式的情况,相比第一种来说更灵活,更通用。重要的是每行必须是一个完整的JSON,一个JSON不能跨越多行,也就是说,serde不会对多行的Json有效。 因为这是由Hadoop处理文件的工作方式决定,文件必须是可拆分的,基于次开源的序列化工具hive-json-serde使用起来就显得特别方便了
https://github.com/rcongiu/Hive-JSON-Serde
下载对应版本的jar包后,将其添加在hive的anxlib中就可以使用了

<property>
     <name>hive.aux.jars.path</name>
      <value>auxlib/json-serde-1.3.8-jar-with-dependencies.jar</value>
 </property>

注意之前版本有bug,在使用hiveserver2的时候解析会实效,有类型转化的错误。
注意建表的时候 需要指定序列化对应的方式org.openx.data.jsonserde.JsonSerDe

ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES ( 
  'ignore.malformed.json'='true', 
  'mapping.position'='where', 
  'mapping.ts'='timestamp') 

‘ignore.malformed.json’=‘true’ 忽略坏数据为null,避免查询报错。
‘mapping.position’=‘where’, 将where字段列名映射为position字段,避免关键词作为列名使用不方便的问题, ‘mapping.ts’=‘timestamp’ 将timestamp映射为ts,作用和where相同,注意hive是大小写不敏感的,但是列名称必须和json数据结构中的列名相同,只是忽略大小写,如果不存在,则返回null值。
具体请参考

对应map这种 在union的时候,如果字段为null 如何拼接呢
map<string,string>

str_to_map(text[, delimiter1, delimiter2])

Splits text into key-value pairs using two delimiters. Delimiter1 separates text into K-V pairs, and Delimiter2 splits each K-V pair. Default delimiters are ‘,’ for delimiter1 and ‘=’ for delimiter2.

select str_to_map(“a:a&b:b”, ‘&’, ‘:’);
OK
{“a”:“a”,“b”:“b”}
https://github.com/rcongiu/Hive-JSON-Serde

<think>好的,我现在需要回答用户关于Hive使用标准JSON格式的语法和示例的问题。首先,我得回忆一下Hive处理JSON的常用方法。用户提到了“标准JSON格式”,可能是指如何正确解析符合JSON格式数据,比如对象或数组。 我记得Hive本身不直接支持JSON格式的解析,但可以通过一些内置函数来处理。比如get_json_object和json_tuple这两个函数。get_json_object用于提取JSON字符串中的特定字段,语法是get_json_object(json_str, '$.key')。而json_tuple则可以同时提取多个字段,可能在处理多个键时更高效。 另外,用户提供的引用中提到了处理JSON数组的情况,比如使用lateral view和explode函数来展开数组。这可能涉及到嵌套查询或者侧视图的使用,需要详细说明步骤。 接下来需要考虑示例部分。用户可能需要具体的例子来展示如何创建表、加载数据以及使用这些函数解析JSON。例如,假设有一个包含JSON字符串的表,如何从中提取字段。对于数组的情况,可能需要结合explode和lateral view来处理,比如将数组中的每个元素展开成多行。 还要注意用户提到的标准JSON格式的定义,可能需要说明HiveJSON的支持方式,比如每行一个完整的JSON对象,或者整个文件是JSON数组。但Hive通常处理的是每行一条记录的情况,所以可能需要将JSON存储为字符串类型,然后通过函数解析。 此外,用户引用中提到了字符串与日期格式的转换,虽然问题主要关于JSON,但可能在处理JSON中的日期字段时需要用到相关函数,可以简要提及。 需要确保回答结构清晰,分点说明语法和示例,并给出相关问题。同时,检查引用是否正确标注,比如引用[^1]和[^2]关于JSON解析的内容,引用[^3]关于日期转换的内容。 最后,验证语法是否正确,比如JSON路径是否正确,函数名称是否准确,示例代码是否存在错误。确保使用中文回答,并且数学表达式或代码块格式正确。</think>### Hive中标准JSON格式使用方法 Hive通过内置函数和特殊语法支持对标准JSON数据的解析,主要分为单层JSON对象和嵌套JSON数组两种场景。 #### 一、单层JSON对象解析 **语法规则**: 使用`get_json_object`函数提取特定字段,路径表达式需以`$.`开头: ```sql SELECT get_json_object(json_column, '$.key') FROM table; ``` **示例**: 假设表`user_log`包含JSON字符串字段`log_data`: ```json {"user_id": 101, "device": "iOS", "time": "2023-08-01 14:30:00"} ``` 提取字段: ```sql SELECT get_json_object(log_data, '$.user_id') AS uid, get_json_object(log_data, '$.device') AS os FROM user_log; ``` #### 二、嵌套JSON数组解析 **语法规则**: 结合`lateral view`和`explode`函数展开数组: ```sql SELECT json_tuple(json_str, 'key1', 'key2') AS (col1, col2) FROM table LATERAL VIEW explode(split(regexp_replace(json_array, '[\\[\\]]', ''), '},\\{')) arr AS json_str; ``` **示例**: 解析订单商品数组: ```json {"order_id": 2001, "items": [{"name": "book", "price": 35}, {"name": "pen", "price": 5}]} ``` 处理步骤: ```sql SELECT get_json_object(main_data, '$.order_id') AS order_id, get_json_object(item, '$.name') AS product_name, get_json_object(item, '$.price') AS price FROM ( SELECT explode(split(regexp_replace( get_json_object(raw_data, '$.items'), '^\\[|\\]$', ''), '\\},\\{')) AS item, raw_data AS main_data FROM orders ) tmp; ``` #### 三、时间格式处理 JSON中的时间字段可通过`from_unixtime`转换: ```sql SELECT from_unixtime( unix_timestamp( get_json_object(log_data, '$.time'), 'yyyy-MM-dd HH:mm:ss' ) ) AS event_time FROM user_log; -- [^3] ``` #### 四、建表最佳实践 建议将JSON存储为`STRING`类型: ```sql CREATE TABLE json_table ( raw_data STRING ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值