Hive SQL 精进系列: JSON_TUPLE 快速提取多键值

embedded/2025/3/16 9:58:33/



一、引言

Hive 作为大数据处理的常用工具,提供了诸多处理 JSON 数据的函数,json_tupleget_json_objectfrom_json 便是其中重要的几个。json_tuple 能够高效地从 JSON 字符串中提取指定的键对应的值。本文将详细介绍 json_tuple 函数的语法、应用场景,同时与 get_json_objectfrom_json 进行对比,并阐述使用时的注意事项。

二、json_tuple 函数基础

2.1 基本语法

json_tuple 函数的基本语法如下:

sql">json_tuple(json_str, key1, key2, ..., keyN)

参数解释

  • json_str:这是要解析的 JSON 字符串,是函数的必需输入。它可以是一个直接的 JSON 字符串常量,也可以是表中存储 JSON 数据的列名。
  • key1, key2, ..., keyN:这些是要从 JSON 字符串中提取的键。可以指定一个或多个键,函数会按照指定的顺序返回这些键对应的值。

返回值

json_tuple 函数返回一个包含多个值的元组,元组中的值依次对应指定的键在 JSON 字符串中的值。如果某个键在 JSON 字符串中不存在,对应的返回值为 NULL

简单示例

假设我们有一个简单的 JSON 字符串 {"name": "John", "age": 30, "city": "New York"},可以使用 json_tuple 函数提取其中的 nameage

sql">SELECT json_tuple('{"name": "John", "age": 30, "city": "New York"}', 'name', 'age') AS (name, age);

在这个示例中,函数会返回一个包含 nameage 值的元组,查询结果将显示 John30

三、应用场景

3.1 数据提取与分析

在实际的数据处理中,我们常常需要从 JSON 数据中提取特定的信息进行分析。例如,在处理用户行为日志时,日志数据可能以 JSON 格式存储,包含用户的 ID、操作时间、操作类型等信息。我们可以使用 json_tuple 函数提取这些信息,以便进行后续的统计和分析。

sql">-- 创建示例表
CREATE TABLE user_logs (log_id INT,log_json STRING
);-- 插入示例数据
INSERT INTO user_logs VALUES
(1, '{"user_id": 101, "action_time": "2024-01-01 10:00:00", "action_type": "login"}'),
(2, '{"user_id": 102, "action_time": "2024-01-01 10:10:00", "action_type": "logout"}');-- 提取用户 ID 和操作类型
SELECT log_id,json_tuple(log_json, 'user_id', 'action_type') AS (user_id, action_type)
FROM user_logs;

通过这个查询,我们可以方便地从 log_json 列中提取 user_idaction_type 信息,为后续的用户行为分析提供基础。

3.2 数据集成与转换

在数据集成过程中,不同系统之间的数据格式可能不一致。如果某个系统提供的数据是 JSON 格式,而我们需要将其集成到 Hive 表中进行统一处理,json_tuple 函数可以帮助我们提取所需的数据并进行转换。

sql">-- 创建源数据表
CREATE TABLE source_data (id INT,json_data STRING
);-- 插入示例数据
INSERT INTO source_data VALUES
(1, '{"product_id": 1001, "product_name": "iPhone", "price": 999}'),
(2, '{"product_id": 1002, "product_name": "iPad", "price": 599}');-- 创建目标表
CREATE TABLE target_data (id INT,product_id INT,product_name STRING,price DOUBLE
);-- 插入数据并提取所需信息
INSERT INTO target_data
SELECT id,json_tuple(json_data, 'product_id', 'product_name', 'price') AS (product_id, product_name, price)
FROM source_data;

在这个示例中,我们使用 json_tuple 函数从 source_data 表的 json_data 列中提取 product_idproduct_nameprice 信息,并插入到 target_data 表中,实现了数据的集成和转换。

3.3 复杂 JSON 数据处理

虽然 json_tuple 主要用于简单的 JSON 数据提取,但在一些情况下,也可以结合其他函数处理复杂的 JSON 数据。例如,对于嵌套的 JSON 数据,我们可以先使用 get_json_object 函数提取嵌套部分的 JSON 字符串,再使用 json_tuple 函数进一步提取所需信息。

{"order_id": 12345,"customer": {"name": "Alice","email": "alice@example.com"},"items": [{"product_name": "Book","quantity": 2,"price": 19.99}]
}
sql">-- 提取 customer 部分的 JSON 字符串
WITH customer_json AS (SELECT get_json_object('{"order_id": 12345, "customer": {"name": "Alice", "email": "alice@example.com"}, "items": [{"product_name": "Book", "quantity": 2, "price": 19.99}]}', '$.customer') AS customer_str
)
-- 从 customer 部分提取 name 和 email
SELECT json_tuple(customer_str, 'name', 'email') AS (name, email) FROM customer_json;

在这个示例中,我们先使用 get_json_object 函数提取 customer 部分的 JSON 字符串,再使用 json_tuple 函数从该字符串中提取 nameemail 信息。

四、json_tuple、get_json_object 和 from_json 的对比

4.1 功能特点

  • json_tuple:专注于从 JSON 字符串中一次性提取多个指定键的值,返回一个包含这些值的元组。它的使用较为简单直接,适用于只需要提取少数几个固定键值的场景。
  • get_json_object:根据 JSON 路径表达式从 JSON 字符串中提取特定路径的值。它更侧重于灵活的路径匹配,能够处理嵌套结构的 JSON 数据,但每次只能提取一个值。
  • from_json:将 JSON 字符串解析为符合指定 schema 的结构化数据,支持 structarraymap 等复杂数据类型。它可以全面解析 JSON 数据的结构,适用于需要对整个 JSON 数据进行结构化处理的场景。

4.2 语法和使用复杂度

  • json_tuple:语法简洁,只需指定 JSON 字符串和要提取的键,易于理解和使用。对于简单的键值提取任务,代码量较少。
  • get_json_object:需要使用 JSON 路径表达式,对于复杂的嵌套结构,路径表达式可能会比较复杂,增加了使用的难度。而且如果需要提取多个值,需要多次调用该函数。
  • from_json:需要定义 schema 来描述 JSON 数据的结构,对于复杂的 JSON 数据,schema 的定义可能会比较繁琐。但一旦定义好 schema,可以方便地访问和处理解析后的结构化数据。

4.3 性能表现

  • json_tuple:由于只提取指定的键值,不需要对整个 JSON 数据进行解析,因此在处理简单 JSON 数据且只需要提取少数几个键值时,性能较高。
  • get_json_object:每次调用只提取一个值,对于需要提取多个值的情况,多次调用会增加开销。但在处理复杂嵌套结构时,其性能相对稳定。
  • from_json:需要根据 schema 对整个 JSON 数据进行解析和转换,对于大规模数据和复杂 schema,可能会有一定的性能开销。

4.4 示例对比

假设有 JSON 数据 {"person": {"name": "Bob", "age": 28}, "hobbies": ["reading", "swimming"]},以下是使用三个函数提取不同信息的示例:

使用 json_tuple
sql">-- 假设将 JSON 数据存储在变量 json_str 中
SELECT json_tuple(json_str, 'person', 'hobbies') AS (person, hobbies);

这里只能提取 personhobbies 对应的值,但无法进一步解析嵌套结构。

使用 get_json_object
sql">SELECT get_json_object(json_str, '$.person.name') AS name,get_json_object(json_str, '$.hobbies[0]') AS first_hobby;

可以通过路径表达式提取嵌套结构中的具体值,但需要多次调用。

使用 from_json
sql">SELECT from_json(json_str, 'struct<person:struct<name:string, age:int>, hobbies:array<string>>').person.name AS name,from_json(json_str, 'struct<person:struct<name:string, age:int>, hobbies:array<string>>').hobbies[0] AS first_hobby;

可以将整个 JSON 数据解析为结构化数据,方便访问嵌套结构中的值,但需要定义复杂的 schema

五、使用注意事项

5.1 键的大小写敏感性

json_tuple 函数对键的大小写是敏感的。如果 JSON 字符串中的键是大写或混合大小写,在指定键时必须使用相同的大小写,否则可能无法正确提取值。

5.2 空值处理

如果指定的键在 JSON 字符串中不存在,json_tuple 函数会返回 NULL。在使用返回结果时,需要注意处理 NULL 值,避免出现错误。

5.3 性能考虑

在处理大规模数据时,json_tuple 函数的性能可能会受到影响。可以考虑在数据导入阶段进行预处理,或者使用分布式计算框架来提高处理效率。

六、总结

Hive SQL 的 json_tuple 函数为处理 JSON 数据提供了一种简单、高效的方式。它能够快速从 JSON 字符串中提取指定的键对应的值,适用于数据提取、集成和简单的 JSON 数据处理场景。与 get_json_objectfrom_json 相比,json_tuple 在功能、语法、性能等方面各有优劣。在实际应用中,需要根据具体的业务需求和数据特点,合理选择使用这三个函数。同时,要注意键的大小写敏感性、空值处理和性能问题。


http://www.ppmy.cn/embedded/173033.html

相关文章

Python - 爬虫;爬虫-网页抓取数据-工具curl

一、爬虫 关于爬虫的合法性 通用爬虫限制&#xff1a;Robots协议【约定协议robots.txt】 robots协议&#xff1a;协议指明通用爬虫可以爬取网页的权限robots协议是一种约定&#xff0c;一般是大型公司的程序或者搜索引擎等遵守 几乎每一个网站都有一个名为 robots.txt 的文…

什么是 MyBatis?

文章目录 1️⃣ MyBatis 简介&#x1f4cc; MyBatis 主要特点 2️⃣ MyBatis vs 传统 JDBC vs Hibernate &#x1f4ca;3️⃣ MyBatis 核心组件 &#x1f3d7;️1. SqlSessionFactory2. SqlSession3. Mapper&#xff08;映射器&#xff09; 4️⃣ MyBatis 配置文件结构 &#x…

Unity 封装一个依赖于MonoBehaviour的计时器(上) 基本功能

灵感来自下面这本书的协程部分,因此我就自己尝试写了一个 我的新书Unity3D游戏开发&#xff08;第3版&#xff09; | 雨松MOMO程序研究院 如果你不知道什么是协程:unity保姆级教程之协同程序_unity协同-CSDN博客 一句话概括:协程就是单线程的异步操作,其作用于Unity的主线程 1…

5 分钟搭建 Prometheus + Grafana 监控

一.安装 Prometheus cd /usr/local/ wget https://github.com/prometheus/prometheus/releases/download/v2.38.0/prometheus-2.38.0.linux-amd64.tar.gz tar xvf prometheus-2.38.0.linux-amd64.tar.gz ln -s prometheus-2.38.0.linux-amd64 prometheus二.安装 node_exporter…

爬虫逆向:Unicorn 详细使用指南

文章目录 1. Unicorn 介绍1.1 Unicorn 的特点1.2 Unicorn功能2. 安装 Unicorn2.1 安装 Python 绑定2.2 安装 Unicorn 核心库3. Unicorn 的基本使用3.1 初始化模拟器3.2 映射内存3.3 写入代码3.4 设置寄存器3.5 执行代码3.6 读取寄存器4. Unicorn 的高级功能4.1 钩子函数4.2 异常…

使用Python和Keras库实现基于双向门控循环单元(BiGRU)模型进行深度学习序列预测的示例

下面是一个使用Python和Keras库实现基于双向门控循环单元&#xff08;BiGRU&#xff09;模型进行深度学习序列预测的示例。我们将使用一个简单的正弦波时间序列数据来演示该过程。 步骤&#xff1a; 数据生成&#xff1a;生成正弦波时间序列数据。数据预处理&#xff1a;将数…

MAC地址IP地址如何转换?

0. 运维干货分享 软考系统架构设计师三科备考经验附学习资料CKA认证学习资料分享信息安全管理体系&#xff08;ISMS&#xff09;制度模板分享免费文档翻译工具(支持word、pdf、ppt、excel)PuTTY中文版安装包MobaXterm中文版安装包pinginfoview网络诊断工具中文版 在计算机网络…

1.排序算法(学习自用)

1.冒泡排序 算法步骤 相邻的元素之间对比&#xff0c;每次早出最大值或最小值放到最后或前面&#xff0c;所以形象的称为冒泡。 特点 n个数排序则进行n轮&#xff0c;每轮比较n-i次。所以时间复杂度为O(n^2)&#xff0c;空间复杂度为O(1)&#xff0c;该排序算法稳定。 代码…