一、JSON 数据
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在不同的编程语言之间进行数据传输时非常通用和常用。JSON 格式简单直观,易于阅读和编写,并且可以被大多数编程语言轻松解析和生成。
1. JSON 特点
- 轻量级:JSON 的格式简单,数据量较小,适合网络传输。
- 可读性强:JSON 使用键值对来表示数据,非常直观,易于人类阅读和编写。
- 广泛支持:几乎所有的编程语言(如 JavaScript、Python、Java、C# 等)都支持 JSON,并且有内置或第三方库可以方便地解析和生成 JSON 数据。
2. JSON 的语法
- 对象:由
{}
包围,使用键值对表示数据,键和值之间用冒号:
分隔,键值对之间用逗号,
分隔。{"name":"John Doe","age":30,"email":"[email protected]"}
- 值的类型:可以是字符串、数字、对象、数组、布尔值(true/false)或 null,甚至可以继续嵌套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
并将数据导入到该表中:
-- 创建表CREATETABLE users (
user_id INT,
user_info STRING
)ROW FORMAT DELIMITED
FIELDSTERMINATEDBY',';-- 加载数据LOADDATALOCAL INPATH '/path/to/users.json'INTOTABLE users;
然后,使用
get_json_object()
从 JSON 字符串中提取用户的名称和年龄:
SELECT
user_id,
get_json_object(user_info,'$.name')as name,
get_json_object(user_info,'$.age')as age
FROM
users;
示例结果
user_idnameage1John302Jane25
二、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": "杭州"}, "孙七"]}
第一步:提取数据
- 提取时间
SELECT FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot,'$.time')ASBIGINT)/1000))AStimeFROM 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 |
+---------------------+
- 提取城市
SELECT get_json_object(cot,'$.searchValue[0].city')AS city
FROM yizu;
结果:
+--------+
| city |
+--------+
| 深圳 |
| 北京 |
| 上海 |
| 南京 |
| 杭州 |
+--------+
- 提取人名
SELECT get_json_object(cot,'$.searchValue[1]')AS name
FROM yizu;
结果:
+------+
| name |
+------+
| 张三 |
| 李四 |
| 王五 |
| 赵六 |
| 孙七 |
+------+
- 整合查询
SELECT
FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot,'$.time')ASBIGINT)/1000))AStime,
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
将数据合并为字符串
SELECT
concat_ws(',',
FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot,'$.time')ASBIGINT)/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
将字符串切割为数组
SELECT
split(
concat_ws(',',
FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot,'$.time')ASBIGINT)/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
将数组转换为多行显示
SELECT id, c1
FROM(SELECT
id,
split(
concat_ws(',',
FROM_UNIXTIME(FLOOR(CAST(get_json_object(cot,'$.time')ASBIGINT)/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 | 孙七 |
+----+-------------------+
版权归原作者 Data 317 所有, 如有侵权,请联系我们删除。