Hive数仓操作(十三)

embedded/2024/10/11 4:40:16/

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

SELECTuser_id,get_json_object(user_info, '$.name') as name,get_json_object(user_info, '$.age') as age
FROMusers;
示例结果
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_cFROM 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.ppmy.cn/embedded/125705.html

相关文章

大语言模型简介

大语言模型简介 今天我们来聊一聊大语言模型。大语言模型是一种能够处理和理解自然语言的深度学习模型,专门设计用来理解、生成和处理自然语言。 人工智能、机器学习和深度学习 想要理解什么是大语言模型,我们首先要弄清楚几个经常容易被搞混的概念&a…

初级前端面试常见问题(上岸某公司)

一、HTML5CSS篇 1.css隐藏元素方法 display:none position:absolute 移除到可视区域之外 visibility:hidden z-index:负值,用其他元素遮盖 opacity:0 clip/clip-…

【JDK17 | 7】Java 17 深入剖析:基础概述与新特性实战

引言 Java 自 1995 年发布以来,经过多次版本迭代,已成为企业级应用开发的首选语言。随着 Java 17 的发布,作为长期支持(LTS)版本,它带来了许多新特性和增强功能,极大地提升了开发效率和代码可读性。本篇文章将详细介绍 Java 17 的重要概念、安装步骤以及一些核心新特性…

python写的window小工具-一键设置ip自动获取ip

最近有个需求,笔记本在公司上网需要设置固定ip,拿回家之后又要设置自动获取ip,有些美女同事根本就不知道怎么设置,所以我打算开发一个一键设置的小软件供大家使用。 但是不会c,也不会c#,更加不会vb,不可能…

嵌入式开发:STM32 硬件 CRC 使用

测试平台:STM32G474系列 STM32硬件的CRC不占用MCU的资源,计算速度快。由于硬件CRC需要配置一些选项,配置不对就会导致计算结果错误,导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…

Django-rest-framework(DRF)怎么使用redis

一、redis作用 Redis,作为一款开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。以下是Redis的主要作用: 1、高速缓存 Redis能够极大地加速数据的读取速度,因为它将数据存储在内存中通过缓存热点数据&#xff…

运维工具之ansible

Ansible 1.什么是ansible? ​ ansible是基于ssh架构的自动化运维工具,由python语言实现,通过ansible可以远程批量部署等。 2.部署前提 ​ 控制端需要安装ansible,被控制端要开启ssh服务,并允许远程登录,被管理主机需要安装py…

喜讯!迈威通信TSN产品通过“时间敏感网络(TSN)产业链名录计划”评测,各项指标名列前茅

TSN技术,作为推动企业网络化与智能化转型的关键力量,已成为工业网络迈向下一代演进的共识方向,正加速重构工业网络的技术架构与产业生态。为响应这一趋势,工业互联网产业联盟携手中国信息通信研究院及50余家产学研用单位&#xff…