0


Hive数仓操作(十三)

一、JSON 数据

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在不同的编程语言之间进行数据传输时非常通用和常用。JSON 格式简单直观,易于阅读和编写,并且可以被大多数编程语言轻松解析和生成。

1. JSON 特点

  1. 轻量级:JSON 的格式简单,数据量较小,适合网络传输。
  2. 可读性强:JSON 使用键值对来表示数据,非常直观,易于人类阅读和编写。
  3. 广泛支持:几乎所有的编程语言(如 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": "杭州"}, "孙七"]}

第一步:提取数据

  1. 提取时间
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 |
+---------------------+
  1. 提取城市
SELECT get_json_object(cot,'$.searchValue[0].city')AS city
FROM yizu;

结果:

+--------+
|  city  |
+--------+
|  深圳  |
|  北京  |
|  上海  |
|  南京  |
|  杭州  |
+--------+
  1. 提取人名
SELECT get_json_object(cot,'$.searchValue[1]')AS name
FROM yizu;

结果:

+------+
| name |
+------+
| 张三 |
| 李四 |
| 王五 |
| 赵六 |
| 孙七 |
+------+
  1. 整合查询
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 |  杭州  | 孙七 |
+---------------------+--------+------+

第二步:数据处理

  1. 使用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,杭州,孙七 |
+-----------------------+
  1. 使用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", "杭州", "孙七"]         |
+------------------------------------------------+
  1. 使用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 | 孙七              |
+----+-------------------+

本文转载自: https://blog.csdn.net/m0_58076578/article/details/142696361
版权归原作者 Data 317 所有, 如有侵权,请联系我们删除。

“Hive数仓操作(十三)”的评论:

还没有评论