当前位置: 首页 > article >正文

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": "john.doe@example.com"
    }
    
  • 值的类型:可以是字符串、数字、对象、数组、布尔值(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 并将数据导入到该表中:

-- 创建表
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 字符串中提取用户的名称和年龄:

SELECT
    user_id,
    get_json_object(user_info, '$.name') as name,
    get_json_object(user_info, '$.age') as age
FROM
    users;
示例结果
user_idnameage
1John30
2Jane25

二、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') 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 |
+---------------------+
  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') 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 |  杭州  | 孙七 |
+---------------------+--------+------+

第二步:数据处理

  1. 使用concat_ws将数据合并为字符串
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,杭州,孙七 |
+-----------------------+
  1. 使用split将字符串切割为数组
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", "杭州", "孙七"]         |
+------------------------------------------------+
  1. 使用explode将数组转换为多行显示
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 | 孙七              |
+----+-------------------+

http://www.kler.cn/news/334433.html

相关文章:

  • Python 基于 flask 的前程无忧招聘可视化系统,Python大数据招聘爬虫可视化分析
  • 【2024年10月测试通过】conda下使用虚拟环境安装最新版pytorch2.4+cuda12.4
  • 区间预测 | Matlab实现ARIMA-KDE的时间序列结合核密度估计区间预测
  • SaaS 应用如何助长网络犯罪
  • 【AI】AIOT简介
  • 生信科研,教授(优青)团队一站式指导:高通量测序技术--农业植物基因组分析、组蛋白甲基化修饰、DNA亲和纯化测序、赖氨酸甲基化
  • 【python实操】python小程序之两数取大值以及login登录
  • 码随想录算法训练营第62天|卡码网:97. 小明逛公园、127. 骑士的攻击
  • 优化理论及应用精解【22】
  • 数据库常见的安全特性有哪些
  • C语言代码练习(test_1_20)
  • Day02-MySQL数据库服务体系结构
  • Java第二阶段---11封装---第一节 封装(Encapsulation)
  • Relu激活
  • 前端性能优化 面试如何完美回答
  • Oracle数据库中表压缩的实现方式和特点
  • Spring Cloud之OpenFeign的具体实践
  • Qt如何将外部窗口嵌入部件中
  • 若依--文件上传前端
  • 国创——基于深度学习的实时姿态识别算法