hive json字符串处理问题 (转载)

Hive字符串、Json解析 json字符串解析 阅读详情

我们都知道,Hive 内部提供了大量的内置函数用于处理各种类型的需求,参见官方文档:Hive Operators and User-Defined Functions (UDFs)。我们从这些内置的 UDF 可以看到两个用于解析 Json 的函数:get_json_object 和 json_tuple。用过这两个函数的同学肯定知道,其职能解析最普通的 Json 字符串,如下:

hive (default)> SELECT get_json_object(’{“website”:“www.iteblog.com”,“name”:“过往记忆”}’, ‘$.website’);
OK
www.iteblog.com

hive (default)> SELECT json_tuple(’{“website”:“www.iteblog.com”,“name”:“过往记忆”}’, ‘website’, ‘name’);
OK
www.iteblog.com 过往记忆
Time taken: 0.074 seconds, Fetched: 1 row(s)
json_tuple 相对于 get_json_object 的优势就是一次可以解析多个 Json 字段。但是如果我们有个 Json 数组,这两个函数都无法处理,get_json_object 处理 Json 数组的功能很有限,如下:

hive (default)>
>
> SELECT get_json_object(’[{“website”:“www.iteblog.com”,“name”:“过往记忆”}, {“website”:“carbondata.iteblog.com”,“name”:“carbondata 中文文档”}]’, ‘$.[0].website’);
OK
www.iteblog.com
Time taken: 0.069 seconds, Fetched: 1 row(s)
如果我们想将整个 Json 数组里面的 website 字段都解析出来,如果这么写将非常麻烦,因为我们无法确定数组的长度,而且即使确定了,这么写可维护性也很差,所以我们需要想别的办法。

使用 Hive 自带的函数解析 Json 数组

在介绍如何处理之前,我们先来了解下 Hive 内置的 explode 函数,官方的解释是:explode() takes in an array (or a map) as an input and outputs the elements of the array (map) as separate rows. UDTFs can be used in the SELECT expression list and as a part of LATERAL VIEW. 意思就是 explode() 接收一个 array 或 map 类型的数据作为输入,然后将 array 或 map 里面的元素按照每行的形式输出。其可以配合 LATERAL VIEW 一起使用。光看文字描述很不直观,咱们来看看几个例子吧。

hive (default)> select explode(array(‘A’,‘B’,‘C’));
OK
A
B
C
Time taken: 4.188 seconds, Fetched: 3 row(s)

hive (default)> select explode(map(‘A’,10,‘B’,20,‘C’,30));
OK
A 10
B 20
C 30
相信不需要我描述大家就能看明白这个函数的意义。大家可能会问,这个函数和我们解析 Json 数组有毛关系啊。其实有关系,我们其实可以使用这个函数将 Json 数组里面的元素按照一行一行的形式输出。根据这些已有的知识,我们可以写出以下的 SQL 语句:

hive (default)> SELECT explode(split(regexp_replace(regexp_replace(’[{“website”:“www.iteblog.com”,“name”:“过往记忆”},{“website”:“carbondata.iteblog.com”,“name”:“carbondata 中文文档”}]’, ‘{’,’\}\;\{’),’\[|\]’,’’),’\;’));
OK
{“website”:“www.iteblog.com”,“name”:“过往记忆”}
{“website”:“carbondata.iteblog.com”,“name”:“carbondata 中文文档”}
现在我们已经能正确的解析 Json 数据了。

你现在肯定不知道上面一堆的 SQL 是啥含义,这里我来一步一步的解释。
explode 函数只能接收数组或 map 类型的数据,而 split 函数生成的结果就是数组;
第一个 regexp_replace 的作用是将 Json 数组元素之间的逗号换成分号,所以使用完这个函数之后,[{“website”:“www.iteblog.com”,“name”:“过往记忆”},{“website”:“carbondata.iteblog.com”,“name”:“carbondata 中文文档”}] 会变成 [{“website”:“www.iteblog.com”,“name”:“过往记忆”};{“website”:“carbondata.iteblog.com”,“name”:“carbondata 中文文档”}]
第二个 regexp_replace 的作用是将 Json 数组两边的中括号去掉,所以使用完这个函数之后,[{“website”:“www.iteblog.com”,“name”:“过往记忆”},{“website”:“carbondata.iteblog.com”,“name”:“carbondata 中文文档”}] 会变成 {“website”:“www.iteblog.com”,“name”:“过往记忆”},{“website”:“carbondata.iteblog.com”,“name”:“carbondata 中文文档”}
然后我们可以结合 get_json_object 或 json_tuple 来解析里面的字段了:

hive (default)> select json_tuple(json, ‘website’, ‘name’) from (SELECT explode(split(regexp_replace(regexp_replace(’[{“website”:“www.iteblog.com”,“name”:“过往记忆”},{“website”:“carbondateblog.com”,“name”:“carbondata 中文文档”}]’, ‘\}\,\{’,’\}\;\{’),’\[|\]’,’’),’\;’)) as json) iteblog;
OK
www.iteblog.com 过往记忆
carbondata.iteblog.com carbondata 中文文档
Time taken: 0.189 seconds, Fetched: 2 row(s)
自定义函数解析 Json 数组

虽然可以使用 Hive 自带的函数类解析 Json 数组,但是使用起来还是有些麻烦。值得高兴的是, Hive 提供了强大的自定义函数(UDF)的接口,我们可以使用这个功能来编写解析 Json 数组的 UDF。具体的代码如下:

package com.iteblog.udf.json;

import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;

@Description(name = “json_array”,
value = “FUNC(array_string) - Convert a string of a JSON-encoded array to a Hive array of strings.”)
public class UDFJsonAsArray extends UDF {
public ArrayList evaluate(String jsonString) {
if (jsonString == null) {
return null;
}
try {
JSONArray extractObject = new JSONArray(jsonString);
ArrayList result = new ArrayList();
for (int ii = 0; ii < extractObject.length(); ++ii) {
result.add(extractObject.get(ii).toString());
}
return result;
} catch (JSONException e) {
return null;
} catch (NumberFormatException e) {
return null;
}
}
}
上面的代码逻辑很简单,我就不介绍了。将上面的代码进行编译打包,假设打包完的 jar 包名称为 iteblog.jar,然后我们就可以如下使用这个函数了。

hive (default)> add jar /home/iteblog/iteblog.jar;
Added [/home/iteblog/iteblog.jar] to class path
Added resources: [/home/iteblog/iteblog.jar]
hive (default)> create temporary function json_array as ‘com.iteblog.udf.json.UDFJsonAsArray’;
OK
Time taken: 0.013 seconds
hive (default)>
> select explode(json_array(’[{“website”:“www.iteblog.com”,“name”:“过往记忆”},{“website”:“carbondata.iteblog.com”,“name”:“carbondata 中文文档”}]’));
OK
{“website”:“www.iteblog.com”,“name”:“过往记忆”}
{“website”:“carbondata.iteblog.com”,“name”:“carbondata 中文文档”}
Time taken: 0.08 seconds, Fetched: 2 row(s)

hive (default)> select json_tuple(json, ‘website’, ‘name’) from (SELECT explode(json_array(’[{“website”:“www.iteblog.com”,“name”:“过往记忆”},{“website”:“carbondata.iteblog.com”,“name”:“carbta 中文文档”}]’)) as json) iteblog;
OK
www.iteblog.com 过往记忆
carbondata.iteblog.com carbondata 中文文档
Time taken: 0.082 seconds, Fetched: 2 row(s)
这个结果和上面使用 Hive 内置的函数结果一致。当然,你还可以实现其他的 UDF,逻辑和这个类似,就不再介绍了

2023年金蝶云星辰初级顾问认证参考试题(1) 最新积累的考试真题,答案只供参考(49分T~T),欢迎大佬们更正,私聊我修改,有新的试题也可以私聊我,日后会完善题库!大家一起努力,预祝大家顺利通过!1.【简单】生产环节中,客户老板希望掌握材料的超发或漏发情况,,以便分析用料情况,对材料浪费进行管控,可以查看什么报表?⒉[中等】客户主营电气柜的生产销售,商品为非标品需定制,又因交期效短,需要边生产边补料,以下哪个功能最适合该客户场景?15.【简单】在给商品设置科目关联时,分别按照单个商品,商品类别,所有商品设置了对应客户,()优先级最高。 阅读详情

相关推荐

HI3516CV610海思SOC:超高清智慧视觉开发全攻略

本文全面解析海思HI3516CV610 SOC在超高清智慧视觉开发中的应用。该芯片集成双核A7处理器、1Tops NPU、AI ISP及4K视频编码器,专为智能摄像头设计。文章详细介绍了开发环境搭建、核心硬件架构、媒体处理平台(MPP)实战、AI算法集成与系统调优等全流程攻略,帮助开发者高效构建稳定可靠的视觉AI产品。

weixin_29269441的博客 1257

学会Hive解析Json数组

学会Hive解析Json数组

ytp552200ytp的博客 6502

别再到处找了!2024最新银河麒麟V10全版本(飞腾/龙芯/兆芯)官方下载与安装保姆级教程

本文提供2024年银河麒麟V10操作系统全版本(飞腾/龙芯/兆芯)的官方下载与安装保姆级教程,涵盖版本选择、镜像获取、启动盘制作及安装优化等关键步骤,助您高效部署国产操作系统。

weixin_26846533的博客 490

大数据开发之Hive解析Json数组

在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平​​大数据培训​​台调用数据时,要对埋点数据进行解析。接下来就聊聊Hive中是如何解析json数据的。 Hive自带的json解析函数 1. get_json_object 语法:get_json_object(json_string, '$.key') 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么

m0_58371965的博客 1291

共享单车需求预测问题:建模篇

机器学习训练营——机器学习爱好者的自由交流空间(qq群号:696721295) 在上一篇里,我们使用可视化的方法分析了“共享单车”的数据集,理解了特征(变量)之间的关系。我们将在本篇建立几个模型预测单车的需求量,并比较它们的预测效果。 随机森林填充法 首先,导入必需的库、训练集和检验集。 import pylab import calendar import numpy as np impor...

wong2016的博客 1万+

C++ (week6、7):Linux系统编程4:网络

Linux网络:计算机网络概述、TCP协议、Socket编程、IO多路复用机制(select、epoll)、HTTP协议、进程池、线程池、大文件网络传输问题

Edward2022的博客 1432

hive表分隔符修改实操(兼容sqoop)

版本描述: hive1.1.0-cdh5.16.2 sqoop 1.4.7 结论: 通过如下语句修改分隔符,(网上很多文章只修改了一处,无法识别sqoop过来的数据) #修改分隔符为逗号 , ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim'=',' , 'serialization.format'=',');...

zbz1006572352的博客 1万+

Apache Kafka Connect任意文件读取漏洞(CVE-2025-27817)

由于Apache Kafka客户端未对用户输入进行严格验证和限制,未经身份验证的攻击者可通过构造恶意配置读取环境变量或磁盘任意内容,或向非预期位置发送请求,提升REST API的文件系统/环境/URL访问权限。(CVE-2025-27817)

iSee857的博客 2026

Hive JSON数组炸裂

在Hive中,JSON数组炸裂是指将JSON数组字段拆分成独立的行,以便进行更方便的数据操作和分析。当我们需要处理包含重复信息的JSON数组时,炸裂操作可以将其展开为单独的行,使得每个元素都成为一行数据,方便我们进行进一步的处理。处理嵌套结构数据:当JSON数据中包含嵌套的JSON数组时,我们可以使用JSON数组炸裂来展开嵌套的数组,以方便进行数据处理和查询。分析日志数据:当我们从日志文件中提取JSON数组时,我们可以使用JSON数组炸裂来将数组展开为单独的行,以方便进行日志分析和统计。

cxl_fadacai的博客 1063

34、高效探索柔性蛋白质环构象空间的算法

本文介绍了一种高效探索柔性蛋白质环构象空间的算法,通过种子采样和变形采样两种技术,同时满足运动学闭合和避免空间位阻冲突的约束条件。种子采样能够在闭合无冲突构象空间中广泛生成构象,而变形采样则可以对“有趣”区域进行更密集的探索。实验结果表明,这两种方法在不同大小和受限程度的蛋白质环上均表现出色,运行时间在可接受范围内。相关算法已集成到工具包LoopTK中,可在https://simtk.org/home/looptk获取。

moon9的博客 128

使用verilog实现基于FPGA的TDC设计

verilog实现TDC 高精度时间数字转换器概述(TDC) 简介: TDC被用于测量时间间隔,应用在物理研究、飞行时间测量领域等。 本设计使用verilog实现并在xilinx和altera的FPGA上均可实现! 设计中使用到下述几个模块,包括FIFO,COUNT等,在xilinx下也使用到了一些原语等。下面有实现的代码和仿真截图等。 顶层模块设计如下: module top( input wire start, input wire stop, input wire clk, output wire T

QQ_778132974的博客 6254

hive处理json

{转载}https://www.iteblog.com/archives/2362.html 问题我们都知道,Hive 内部提供了大量的内置函数用于处理各种类型的需求,参见官方文档:Hive Operators and User-Defined Functions (UDFs)。我们从这些内置的 UDF 可以看到两个用于解析 Json 的函数:get_json_object 和 json_tupl...

weixin_39031707的博客 1257

24 SAP CPI 调用SAP HTTP接口

SAP CPI 调用SAP HTTP接口

SAP CPI 1289

Hive解析Json数据

HIVE直接读入json的函数有两个: (1)get_json_object(string json_string, string path) 返回值: string 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。 举例: hive> select get_json_object(‘{“store”:{“fruit...

烂笔头的专栏 2248

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

hive处理json数据_HIVE json格式数据的处理-阿里云开发者社区

在hive 避免不了Jason格式的话,可以使用如下两个函数HIVE直接读入json的函数有两个:(1)get_json_object(string json_string, string path)返回值:string说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。举例:hive>selectget_json...

weixin_40007548的博客 206

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【转载】hive 中 统计某字段json数组中每个value出现的次数

有这样一个json串 {"viewdata":[{"city_id":"59","position_id":0,"qd_title":"网红打卡地","list_id":35},{"city_id":"59","position_id":1,"qd_title":"看青山游绿水","list_id":37}]} 需要将json数组里的qd_title都提取出来转换成hive中的array数组。下面介绍两种方法 法一get_json_object+正则 1.首先可以使用get_json_object函数,提

Marco_L的博客 1616

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

hive sql json转map

给大家整理了一些有关【JS,AP】的项目学习资料(附讲解~~):https://edu.51cto.com/course/33944.htmlhttps://edu.51cto.com/course/19064.htmlHive SQL JSON转Map的实现指南 在大数据处理的过程中,我们常常需要将存储在Hive中的...

weixin_40923270的博客 607

转载:hive学习5:自定义函数之json对象转换hive数据存储

原始链接:https://www.pianshen.com/article/931082274/ hive学习5:自定义函数之json对象转换hive数据存储 技术标签:hive 0元数据,上传到服务器上: {"movie":"2717","rate":"3","timeStamp":"978298196","uid":"2"} {"movie":"2571","rate":"4","timeStamp":"978299773","uid":"2"} ...

黄道婆的专栏 199

HIVE json格式数据的处理

转载:http://www.cnblogs.com/casicyuan/p/4375080.html 今天要处理一个以json格式存储的数据,想要直接把json的各个项的数据存入HIVE表中。 HIVE直接读入json的函数有两个: (1)get_json_object(string json_string, string path) 返回值: string   说明

Beeman_xia的世界 1839

过往记忆的专栏文章转载:如何在 Apache Hive 中解析 Json 数组

原文链接:https://www.iteblog.com/archives/2362.html 如何在 Apache Hive 中解析 Json 数组 Hive2018-07-04 15:53:01156010评论下载为PDF为什么无法评论和登录 文章目录 1问题 2使用 Hive 自带的函数解析 Json 数组 3自定义函数解析 Json 数组 问题 我们都知道,Hive内部提供了大量的内置函数用于处理各种类型的需求,参见官方文档:Hive Operato...

黄道婆的专栏 184

Hive提取Json字段(字符串格式)

get_json_object(列名,’$.需要筛出的字段’) ⬆️用上面的方法,提取出来的是字符串格式的全部字段。 select get_json_object(col name in hive, '$.json字段') as <any name you want> from <hive 表> where <可能需要加上分区字段>...

anchen1991的博客 2418

Hive常用字符串函数

转载自 过往记忆(https://www.iteblog.com/) 本文链接:【Hive常用字符串函数】(https://www.iteblog.com/archives/1639.html) Hive内部提供了很多操作字符串的相关函数,本文将对其中部分常用的函数进行介绍。 下表为Hive内置的字符串函数,具体的用法可以参见本文的下半部分。 返回类型 函数名 描述 ...

weixin_44196083的博客 826
上一篇: HBase持续学习
下一篇: Hive grouping sets grouping_id cube rollup
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值