一、JSON 数据
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在不同的编程语言之间进行数据传输时非常通用和常用。JSON 格式简单直观,易于阅读和编写,并且可以被大多数编程语言轻松解析和生成。
1. JSON 特点
- 轻量级:JSON 的格式简单,数据量较小,适合网络传输。
- 可读性强:JSON 使用键值对来表示数据,非常直观,易于人类阅读和编写。
- 广泛支持:几乎所有的编程语言(如 JavaScript、Python、Java、C# 等)都支持 JSON,并且有内置或第三方库可以方便地解析和生成 JSON 数据。
2. JSON 的语法
-
对象 :由
{}
包围,使用键值对表示数据,键和值之间用冒号:
分隔,键值对之间用逗号,
分隔。json{ "name": "John Doe", "age": 30, "email": "john.doe@example.com" }
-
值的类型:可以是字符串、数字、对象、数组、布尔值(true/false)或 null,甚至可以继续嵌套json。
json{ "string": "hello", "number": 123, "object": {"key": "value"}, "array": [1, 2, 3], "boolean": true, "null_value": null }
3. JSON 在 Hive 中的使用
在 Hive 中,处理 JSON 数据非常常见,可以使用 get_json_object()
等函数来解析和提取 JSON 数据中的信息。
get_json_object()
get_json_object()
函数用于从 JSON 字符串中提取指定路径的数据。
示例数据文件
假设有一个名为 users.json
的文件,内容如下:
1,{"name": "John", "age": 30}
2,{"name": "Jane", "age": 25}
导入数据到 Hive 表
首先,我们创建一个表 users
并将数据导入到该表中:
sql
-- 创建表
CREATE TABLE users (
user_id INT,
user_info STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
-- 加载数据
LOAD DATA LOCAL INPATH '/path/to/users.json' INTO TABLE users;
然后,使用 get_json_object()
从 JSON 字符串中提取用户的名称和年龄:
sql
SELECT
user_id,
get_json_object(user_info, '$.name') as name,
get_json_object(user_info, '$.age') as age
FROM
users;
示例结果
user_id | name | age |
---|---|---|
1 | John | 30 |
2 | Jane | 25 |
二、HIVE的JSON 数据处理
在本案例中,我们将介绍如何从JSON格式的数据中提取时间、城市和人名,并将提取的数据进行进一步处理。
示例数据格式
数据表 yizu
中的 cot
字段示例:
1 {"time": 1672531199000, "sex": "male", "searchValue": [{"province": "广东", "city": "深圳"}, "张三"]}
2 {"time": 1672531199001, "sex": "female", "searchValue": [{"province": "北京", "city": "北京"}, "李四"]}
3 {"time": 1672531199002, "sex": "male", "searchValue": [{"province": "上海", "city": "上海"}, "王五"]}
4 {"time": 1672531199003, "sex": "female", "searchValue": [{"province": "江苏", "city": "南京"}, "赵六"]}
5 {"time": 1672531199004, "sex": "male", "searchValue": [{"province": "浙江", "city": "杭州"}, "孙七"]}
第一步:提取数据
- 提取时间
sql
SELECT FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)) AS time
FROM yizu;
结果:
+---------------------+
| time |
+---------------------+
| 2023-01-01 00:59:59 |
| 2023-01-01 01:00:00 |
| 2023-01-01 01:00:01 |
| 2023-01-01 01:00:02 |
| 2023-01-01 01:00:03 |
+---------------------+
- 提取城市
sql
SELECT get_json_object(cot, '$.searchValue[0].city') AS city
FROM yizu;
结果:
+--------+
| city |
+--------+
| 深圳 |
| 北京 |
| 上海 |
| 南京 |
| 杭州 |
+--------+
- 提取人名
sql
SELECT get_json_object(cot, '$.searchValue[1]') AS name
FROM yizu;
结果:
+------+
| name |
+------+
| 张三 |
| 李四 |
| 王五 |
| 赵六 |
| 孙七 |
+------+
- 整合查询
sql
SELECT
FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)) AS time,
get_json_object(cot, '$.searchValue[0].city') AS city,
get_json_object(cot, '$.searchValue[1]') AS name
FROM yizu;
结果:
+---------------------+--------+------+
| time | city | name |
+---------------------+--------+------+
| 2023-01-01 00:59:59 | 深圳 | 张三 |
| 2023-01-01 01:00:00 | 北京 | 李四 |
| 2023-01-01 01:00:01 | 上海 | 王五 |
| 2023-01-01 01:00:02 | 南京 | 赵六 |
| 2023-01-01 01:00:03 | 杭州 | 孙七 |
+---------------------+--------+------+
第二步:数据处理
- 使用
concat_ws
将数据合并为字符串
sql
SELECT
concat_ws(',',
FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)),
get_json_object(cot, '$.searchValue[0].city'),
get_json_object(cot, '$.searchValue[1]')
) AS new_c
FROM yizu;
结果:
+-----------------------+
| new_c |
+-----------------------+
| 2023-01-01 00:59:59,深圳,张三 |
| 2023-01-01 01:00:00,北京,李四 |
| 2023-01-01 01:00:01,上海,王五 |
| 2023-01-01 01:00:02,南京,赵六 |
| 2023-01-01 01:00:03,杭州,孙七 |
+-----------------------+
- 使用
split
将字符串切割为数组
sql
SELECT
split(
concat_ws(',',
FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)),
get_json_object(cot, '$.searchValue[0].city'),
get_json_object(cot, '$.searchValue[1]')
), ','
) AS new_c
FROM yizu;
结果:
+------------------------------------------------+
| new_c |
+------------------------------------------------+
| ["2023-01-01 00:59:59", "深圳", "张三"] |
| ["2023-01-01 01:00:00", "北京", "李四"] |
| ["2023-01-01 01:00:01", "上海", "王五"] |
| ["2023-01-01 01:00:02", "南京", "赵六"] |
| ["2023-01-01 01:00:03", "杭州", "孙七"] |
+------------------------------------------------+
- 使用
explode
将数组转换为多行显示
sql
SELECT id, c1
FROM (
SELECT
id,
split(
concat_ws(',',
FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot, '$.time') AS BIGINT)/1000)),
get_json_object(cot, '$.searchValue[0].city'),
get_json_object(cot, '$.searchValue[1]')
), ','
) AS new_c
FROM yizu
) a
LATERAL VIEW EXPLODE(new_c) lv AS c1;
结果:
+----+-------------------+
| id | c1 |
+----+-------------------+
| 1 | 2023-01-01 00:59:59|
| 1 | 深圳 |
| 1 | 张三 |
| 2 | 2023-01-01 01:00:00|
| 2 | 北京 |
| 2 | 李四 |
| 3 | 2023-01-01 01:00:01|
| 3 | 上海 |
| 3 | 王五 |
| 4 | 2023-01-01 01:00:02|
| 4 | 南京 |
| 4 | 赵六 |
| 5 | 2023-01-01 01:00:03|
| 5 | 杭州 |
| 5 | 孙七 |
+----+-------------------+