7. Hive解析JSON字符串、JSON数组

news/2024/11/28 15:59:21/

文章目录

      • Hive解析JSON字符串
        • 1. get_json_object
          • 局限性
        • 2. json_tuple
      • Hive解析JSON数组
        • 前置知识
          • explode函数
          • regexp_replace函数
        • 1. 嵌套子查询解析JSON数组(使用explode+regexp_replace)
        • 2. 使用 lateral view 解析JSON数组
      • 学习链接

Hive解析JSON字符串

1. get_json_object

  • 语法:get_json_object(json_string, path)
    • json_string 是要解析的JSON字符串
    • path 是用于指定要提取的字段路径的字符串
-- 示例1(单层JSON)
SELECT get_json_object('{"name": "John","age": 30}', '$.name');
-- res: "John"-- 示例2(嵌套JSON)
SELECT get_json_object('{"person": {"name": "John","age": 30,"address": {"street": "123 Main St","city": "New York"}}}', '$.person.address.street');
-- res: "123 Main St"
局限性
  • get_json_object 函数的性能会受到 JSON数据的结构和大小 的影响。对于较复杂的嵌套结构,考虑使用Hive的其他函数或自定义函数来处理JSON数据可能更合适。
  • get_json_object 函数每次只能返回一个数据项。

2. json_tuple

  • 语法:json_tuple(json_string, field1, field2, ...)
    • json_string 是要解析的JSON字符串
    • field1、field2 ... 是要提取的字段名
-- 示例1(单层JSON)
select json_tuple('{"name": "zhangsan","age": 18}','name','age');
-- res: zhangsan	18-- 示例2(嵌套JSON)
SELECT json_tuple('{"person": {"name": "Alice","age": 25,"address": {"city": "New York","country": "USA"}}}', 'person.name', 'person.age', 'person.address.city');
-- res: Alice    25    New York

Hive解析JSON数组

前置知识

explode函数
  • 语法:explode(Array OR Map)
  • 说明:explode() 函数接收一个 array 或者 map 类型的数据作为输入,然后将 array 或 map 里面的元素按照每行的形式输出,即将 hive 一列中复杂的 array 或者 map 结构拆分成多行显示
-- 解析 array
hive> select explode(array('A','B','C'));
OK
A
B
C-- 解析map
hive> select explode(map('A',10,'B',20,'C',30));
OK
A       10
B       20
C       30
regexp_replace函数
  • 语法: regexp_replace(string A, string B, string C)

  • 说明:将 字符串A中 符合 java正则表达式B 的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。

hive> select regexp_replace('foobar', 'oo|ar', ''); 
OK
fb

1. 嵌套子查询解析JSON数组(使用explode+regexp_replace)

数据如下所示:

array(json_str)
[{“website”:“baidu.com”,“name”:“百度”},{“website”:“google.com”,“name”:“谷歌”}]

解析出其中的website、name

websitename
baidu.com百度
google.com谷歌
-- 思路
-- 1. 使用 regexp_replace 函数将原数据转换为 {"website":"baidu.com","name":"百度"};{"website":"google.com","name":"谷歌"}
-- 2. 使用 split 函数按照 ';' 分割 {"website":"baidu.com","name":"百度"};{"website":"google.com","name":"谷歌"},返回 [{"website":"baidu.com","name":"百度"},{"website":"google.com","name":"谷歌"}]
-- 3. 使用 explode 炸裂为
-- {"website":"baidu.com","name":"百度"}
-- {"website":"google.com","name":"谷歌"}
-- 4. 使用 json_tuple 解析数据-- 实现
-- 1. 先将json数组中的元素解析出来,转化为每行显示
SELECT explode(split(regexp_replace(regexp_replace('[{"website":"baidu.com","name":"百度"},{"website":"google.com","name":"谷歌"}]','\\[|\\]', ''), '\\}\\,\\{', '\\}\\;\\{'), '\\;'));-- 2. 使用 json_tuple 解析数据
select json_tuple(json, 'website', 'name') 
from (
select explode(split(regexp_replace(regexp_replace('[{"website":"baidu.com","name":"百度"},{"website":"google.com","name":"谷歌"}]', '\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;')) 
as json) t1;

上面 regexp_replace 函数中的内容解析:

SELECT explode(split(regexp_replace(regexp_replace('[{"website":"baidu.com","name":"百度"},{"website":"google.com","name":"谷歌"}]', '\\[|\\]' , ''), --将json数组两边的中括号去掉'\\}\\,\\{' , '\\}\\;\\{'), --将json数组元素之间的逗号换成分号'\\;') --以分号作为分隔符(split函数以分号作为分隔));-- 问:为什么要将json数组中元素之间的逗号换成分号?
-- 答:因为元素内的分隔也是逗号,如果不将元素之间的逗号换掉的话,后面用split函数分隔时也会把元素内的数据给分隔,这不是我们想要的结果。

2. 使用 lateral view 解析JSON数组

当我们数据的结构如下,

idsnames
[1,2,3][{“name”: “daming”, “age”: “15”}, {“name”: “lingling”, “age”: “14”}, {“name”: “tom”, “age”: “17”}]

我们想要获取的数据为,

idname
1daming
2daming
3daming
1lingling
2lingling
3lingling
1tom
2tom
3tom
with json_data as (select `array`(1, 2, 3)                        as ids,`array`('{"name": "daming", "age": "15"}', '{"name": "lingling", "age": "14"}','{"name": "tom", "age": "17"}') as json_infos
)-- 使用json_tuple()报错: org.apache.hadoop.hive.ql.parse.SemanticException:
-- UDTF's are not supported outside the SELECT clause, nor nested in expressions
-- 原因: 未知-- SELECT id, json_tuple(json_info, 'name')SELECT id, get_json_object(json_info, '$.name')
FROM json_datalateral view explode(json_data.ids) tmp_ids as idlateral view explode(json_data.json_infos) tmp_json_infos as json_info;

学习链接

文心一言

ChatGPT

Hive解析Json数组超全讲解


http://www.ppmy.cn/news/1078739.html

相关文章

【Electron将HTML项目打包成桌面应用exe文件】

目标:前端将静态页面文件夹所有页面打包成一个exe文件(不包含其它文件)可运行。 步骤 1、初始化 npm init此时项目多出一个package.json文件。 {"name": "my-electron-app","version": "1.0.0",…

Typescript的class语法[类]的操作和应用

TypeScript 是一种面向对象的编程语言,它扩展了 JavaScript,为其添加了类型系统和其他一些特性。TypeScript 的 class 语法可以让开发者更加方便地使用面向对象的编程方式。本文将详细介绍 TypeScript 的 class 语法的操作和应用,并提供代码案…

基于Django+node.js+MySQL+杰卡德相似系数智能新闻推荐系统——机器学习算法应用(含Python全部工程源码)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境node.js前端环境MySQL数据库 模块实现1. 数据预处理2. 热度值计算3. 相似度计算1)新闻分词处理2)计算相似度 4. 新闻统计5. API接口开发6. 前端界面实现1)运行逻辑2&#xff0…

什么是浏览器缓存(browser caching)?如何使用HTTP头来控制缓存?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浏览器缓存和HTTP头控制缓存⭐ HTTP头控制缓存1. Cache-Control2. Expires3. Last-Modified 和 If-Modified-Since4. ETag 和 If-None-Match ⭐ 缓存策略⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击…

使用API调用获取商品数据的完整方案

在电子商务应用程序中,商品详情接口是不可或缺的一部分。它用于从电商平台或自己的数据库中获取商品数据,并将其提供给应用程序的其他部分使用。本文将详细介绍如何设计一个完整的商品详情接口方案,其中包括使用API调用来获取商品数据的过程。…

Mutation Observer 笔记(转)

Mutation Observer API Mutation Observer API 用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动,这个 API 都可以得到通知。 概念上,它很接近事件,可以理解为 DOM 发生变动就会触发 Mutation O…

算法通关村第9关【青铜】| 二分查找

一、基本查找 递增数组&#xff0c;从头往尾查找&#xff0c;O(n)的时间即可找到 public static int find(int[] nums,int target){for(int i 0;i<nums.length;i){if(nums[i] target){return nums[i];}}return -1; } 二、二分查找与分治 有序的数组从头到尾找效率未免…

《C和指针》笔记18:前缀++ 和后缀++

C 语言里有前缀 和后缀&#xff0c;使用还是有点不同的。对应的还有--操作符&#xff0c;但它们的工作原理与此相同&#xff0c;只是它所执行的是减值操作而不是增值操作。我们只要掌握的原理&#xff0c;--的原理也就知道了。 在这里我们把符号叫做操作符&#xff0c;把它操作…