Hive存储读取json

本文介绍了如何在Hive中创建表并导入包含JSON数据的文件。提供了两种方法来读取和解析JSON数据:使用get_json_object函数和json_tuple函数。这两种方法都成功展示了如何提取JSON对象中的`count`和`usage`字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建表

CREATE TABLE tmp_json_test (
           appkey string,
           json string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS textfile ;

2. 导入数据,样例如下:

load data local inpath '/home/jb-gongmingfeng/test_data.log' overwrite into table tmp_json_test;

数据内容如下

appkey001|{"count":2,"usage":91273,"pkg":"com.example.gotest"}

appkey001|{"count":234,"usage":9876,"pkg":"com.example.gotest"}

appkey001|{"count":34,"usage":5432,"pkg":"com.example.msg"}

3. 读取json的数据有两种方法。

方法一:

select t.appkey , get_json_object(t.json,'$.count'), get_json_object(t.json,'$.usage') from tmp_json_test t ;

方法二:

select t1.app

<think>好的,用户需要一个Hive脚本来标准化处理JSON数据。首先,我得回忆下Hive处理JSON的常用方法。记得Hive本身不支持直接读取JSON文件,但可以通过UDF或者内置函数来处理。用户提到的引用里有使用自定义UDF的例子,比如JsonParser函数,还有注册jar包的步骤。 首先,用户可能需要将JSON数据解析成多个字段。根据引用[3],使用split和JsonParser函数来提取各个字段。比如split(JsonParser(line), '\t'),这里可能JsonParser把JSON字符串按制表符分隔,然后split拆分成数组,取不同下标作为字段。不过这种方法可能不够高效,每个字段都要调用一次JsonParser,可能影响性能。 另外,引用[2]中提到创建函数getjson来转换JSON,可能是一个自定义的UDF,将JSON字符串解析为特定格式。用户可能需要类似的功能,将JSON中的各个字段提取出来,并标准化成结构化的表。 接下来,考虑Hive的内置函数。比如get_json_object,可以逐个提取JSON中的字段。例如,对于{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"},可以用get_json_object(line, '$.movie')来获取movie字段的值。这种方法不需要UDF,但需要为每个字段写一次函数调用,可能会比较繁琐。 用户需要标准化的JSON数据,可能每个JSON对象都有相同的结构。这时候可以考虑使用Hivejson_tuple函数,它一次可以提取多个字段,比多次调用get_json_object更高效。例如,json_tuple(line, 'movie', 'rate', 'timeStamp', 'uid'),然后给这些字段命名。 另外,引用[4]提到注册临时函数和使用UDF,比如大小写转换。用户可能需要结合UDF来处理JSON中的复杂结构,或者进行数据清洗,比如转换时间戳格式、统一大小写等。 然后,用户可能希望将处理后的数据保存为结构化的Hive表。所以脚本应该包括创建外部表,指定存储格式,然后通过INSERT语句将解析后的数据插入到目标表中。 还需要注意JSON数据的存储位置,是作为文本文件中的单行记录,还是其他格式。假设每行一个JSON对象,那么在建表时可以使用STORED AS TEXTFILE,然后使用SerDe或者UDF解析。 根据用户提供的引用,特别是引用[3]中的例子,可能用户的数据格式是每行一个JSON对象,字段通过制表符分隔。但更标准的做法是使用HiveJSON SerDe,比如org.apache.hive.hcatalog.data.JsonSerDe,这样在建表时直接指定SerDe,就可以自动解析JSON字段到表的列中。不过这可能需要在Hive中安装HCatalog,或者确认环境是否支持该SerDe。 如果使用SerDe的话,建表语句会更简洁,例如: CREATE EXTERNAL TABLE rat_json ( movie STRING, rate STRING, timeStamp STRING, uid STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION '/user/hive/warehouse/rat_json'; 这样查询时可以直接读取各字段,无需额外解析。但用户可能需要处理更复杂的JSON结构,或者需要自定义解析逻辑,这时候还是需要UDF。 综合来看,用户可能需要两种方法:一种是使用内置函数或SerDe,另一种是使用自定义UDF。根据引用中的示例,用户可能更倾向于使用UDF的方式,比如JsonParser函数。需要提供一个脚本示例,包括注册UDF、建表、解析数据等步骤。 另外,用户提到的标准化可能包括字段类型转换,比如将timeStamp转换为BIGINT,rate转换为INT等。在Hive中,可以在查询时使用CAST函数进行类型转换。 最后,确保脚本中的语法正确,比如添加jar包、创建临时函数、正确的字段别名等。还要考虑性能优化,比如在解析时减少重复调用UDF的次数,使用LATERAL VIEW或者一次解析多个字段。</think>### Hive 标准化 JSON 数据的脚本示例 #### 方法一:使用内置函数 `json_tuple`(无需 UDF) ```sql -- 创建原始数据表(假设数据文件每行存储一个 JSON 对象) CREATE EXTERNAL TABLE raw_json_data ( line STRING ) LOCATION '/user/hive/warehouse/raw_json'; -- 创建标准化目标表 CREATE TABLE standardized_data ( movieid STRING, rate INT, ts BIGINT, uid STRING ); -- 解析 JSON 并插入数据 INSERT INTO TABLE standardized_data SELECT movie_json.movie, CAST(movie_json.rate AS INT), CAST(movie_json.timestamp AS BIGINT), movie_json.uid FROM ( SELECT json_tuple(line, 'movie', 'rate', 'timeStamp', 'uid') AS (movie, rate, timestamp, uid) FROM raw_json_data ) movie_json; ``` #### 方法二:使用自定义 UDF(需预先注册) ```sql -- 注册自定义 JSON 解析 UDF(根据引用[2][3]示例) ADD JAR /opt/hive-udf/json-udf.jar; CREATE TEMPORARY FUNCTION JsonParser AS 'org.example.JsonParser'; -- 解析 JSON 数据并标准化 SELECT split(JsonParser(line), '\t')[0] AS movieid, CAST(split(JsonParser(line), '\t')[1] AS INT) AS rate, CAST(split(JsonParser(line), '\t')[2] AS BIGINT) AS ts, split(JsonParser(line), '\t')[3] AS uid FROM raw_json_data LIMIT 10; ``` #### 方法三:使用 JSON SerDe(需 Hive 环境支持) ```sql CREATE EXTERNAL TABLE standardized_serde ( movie STRING, rate INT, ts BIGINT, uid STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION '/user/hive/warehouse/json_data'; -- 直接查询结构化数据 SELECT * FROM standardized_serde WHERE rate > 3; ``` ### 关键优化点 1. **类型转换**:通过 `CAST()` 函数将字符串转换为数值类型(如 `rate` 转 `INT`)[^3] 2. **性能优化**:使用 `json_tuple` 比多次调用 `get_json_object` 效率更高[^2] 3. **字段映射**:通过 SerDe 自动映射 JSON 键到表字段,简化查询语句[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值