如何在 Apache Hive 中解析 Json 数组

Similar documents
通过Hive将数据写入到ElasticSearch

使用Hive读取ElasticSearch中的数据

Apache CarbonData集群模式使用指南

使用Cassandra和Spark 2.0实现Rest API服务

Spark读取Hbase中的数据

Flume-ng与Mysql整合开发

使用MapReduce读取XML文件

Hadoop&Spark解决二次排序问题(Hadoop篇)

Guava学习之Resources

Hive:用Java代码通过JDBC连接Hiveserver

SparkR(R on Spark)编程指南

Guava学习之CharSequenceReader

使用Spark SQL读取Hive上的数据

在Spring中使用Kafka:Producer篇

三种方法实现Hadoop(MapReduce)全局排序(1)

Apache Spark 2.4 新增内置函数和高阶函数使用介绍

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

Kafka客户端是如何找到 leader 分区的

使用Apache Beam读写HDFS上的文件

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

六种使用Linux命令发送带附件的邮件

将 MySQL 的全量数据导入到 Apache Solr 中

韶关:神奇丹霞

Hive几种数据导入方式

哼, 你 們 不 回 答 又 怎 麼 樣? 不 管 是 多 大 來 頭, 現 在 都 被 血 魔 吞 噬 無 蹤 了 你 們 幾 個 真 是 太 過 分, 我 不 犯 你 們, 你 們 卻 一 天 到 晚 來 挑 釁 我 教 尊 冷 笑 著 說 道 嗚, 大 人 土 地 大 姐 跪 下 來, 流 下

Hadoop元数据合并异常及解决方法

伊春:醉人林都

关林:武圣陵寝

Flink on YARN部署快速入门指南

泰山:五岳独尊

Spark作业代码(源码)IDE远程调试

解决百度统计无法获取https来源的referrer

国内26省市新能源汽车推广规划已出台

新・解きながら学ぶJava

北戴河:海阔天空

Hadoop 2.2.0安装和配置lzo


西岭雪山滑雪场

Spark1.4中DataFrame功能加强,新增科学和数学函数

使用Apache Spark将数据写入ElasticSearch

Flink快速上手(QuickStart)

Spark 2.0介绍:在Spark SQL中定义查询优化规则

Ubuntu和CentOS如何配置SSH使得无密码登陆

JavaIO.PDF

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

21 个你应该知道的 wget 命令

EJB-Programming-3.PDF

三种方法实现Hadoop(MapReduce)全局排序(2)

Microsoft Word - 第3章.doc

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

三种恢复 HDFS 上删除文件的方法

江门:中国第一侨乡

HBase 中加盐(Salting)之后的表如何读取:协处理器篇

Microsoft Word - 01.DOC

是 喔, 就 是 那 個 在 BBS 醫 療 版 跟 你 嗆 聲, 自 稱 有 三 十 多 年 推 拿 經 驗 的 大 叔 嗎? 一 個 看 來 頗 為 清 秀 的 女 生 問 道, 她 語 氣 中 略 感 訝 異 是 啊, 什 麼 推 拿 按 摩 有 多 好, 還 要 人 生 病 盡 量 不 要

Hive常用字符串函数

教育扩张能改善收入分配差距吗?——来自CHNS2006年数据的证据

山水文化,市井人家——以湖州邱城小镇的概念性规划为例

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

基于ECO的UML模型驱动的数据库应用开发1.doc

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

EJB-Programming-4-cn.doc

第一章

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该

Microsoft Word - ch04三校.doc

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

1.5招募说明书(草案)

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该

使用SQL Developer

Flink快速上手之Scala API使用

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

在Fedora上部署Hadoop2.2.0伪分布式平台

自定义Spark Streaming接收器(Receivers)

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 access_token=access_token (http

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

FP.pdf

Cover-3.indd, page Normalize

人 間 菩 提 Part 1 人 間 菩 提 Part 2 清 涼 菩 提 正 覺 修 行 清 心 發 願 自 重 ----


Microsoft PowerPoint - string_kruse [兼容模式]

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该


二零一五年施政報告 - 施政綱領 - 第三章 扶貧及為弱勢社群提供支援

育 部 分 則 由 陳 淑 貞 委 員 及 李 兆 環 委 員 共 同 執 行, 在 此 先 感 謝 各 位 委 員 及 學 者 專 家 之 參 與 二 目 前 評 論 報 告 初 稿 之 架 構 區 分 為 對 政 府 機 關 回 應 意 見 之 觀 察 優 點 及 待 改 進 事 項, 以 及

<4D F736F F D20BACBB0B2C8ABD3EBB7C5C9E4D0D4CEDBC8BEB7C0D6CEA1B0CAAEB6FECEE5A1B1B9E6BBAEBCB C4EAD4B6BEB0C4BFB1EA2E646F63>

附 : 初 中 组 一 等 奖 (31 个 ): 天 河 外 国 语 学 校 中 山 大 学 附 属 中 学 番 禺 区 大 石 富 丽 中 学 广 东 实 验 中 学 附 属 天 河 学 校 花 都 区 实 验 中 学 增 城 区 凤 凰 城 中 英 文 学 校 广 州 市 执 信 中 学 花 都

<4F4BBEFAA576A470BBA15FC160AAED E786C73>

58, ,769 51,911 74,666 35, , , , ,

辽宁铁~1

保 险 公 司 金 富 月 盈 两 产 全 品 保 名 险 称 ( 分 红 型 ) 产 分 品 红 类 型 缴 费 年 类 缴 型 缴 10 费 年 期 缴 限 保 险 期 限 ( 年 ) 聚 富 2 号 两 全 保 险 ( 万 能 型 ) 万 能 型 趸 缴 趸 缴 6 年 龙 享 安 康 重 疾

I

海底捞你学不会

YEN/MIAO CHING MS 27FEB DEL HKG

Microsoft Word - 02文本.docx


Transcription:

问题 我们都知道,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'); www.iteblog.com hive (default)> SELECT json_tuple('{"website":"www.iteblog.com","name":" 过往记忆 "', 'website', 'name'); 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":" 过往记忆 ", {"websi te":"carbondata.iteblog.com","name":"carbondata 中文文档 "]', '$.[0].website'); www.iteblog.com Time taken: 0.069 seconds, Fetched: 1 row(s) 如果我们想将整个 Json 数组里面的 website 字段都解析出来, 如果这么写将非常麻烦, 因为我们无法确定数组的长度, 而且即使确定了, 这么写可维护性也很差, 所以我们需要想别的办法 1 / 5

如果想及时了解 Spark Hadoop 或者 Hbase 相关的文章, 欢迎关注微信公共帐号 :iteblog_hadoop 使用 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')); A B C Time taken: 4.188 seconds, Fetched: 3 row(s) hive (default)> select explode(map('a',10,'b',20,'c',30)); A 10 B 20 C 30 2 / 5

相信不需要我描述大家就能看明白这个函数的意义 大家可能会问, 这个函数和我们解析 Json 数组有毛关系啊 其实有关系, 我们其实可以使用这个函数将 Json 数组里面的元素按照一行一行的形式输出 根据这些已有的知识, 我们可以写出以下的 SQL 语句 : hive (default)> SELECT explode(split(regexp_replace(regexp_replace('[{"website":"www.iteblog. com","name":" 过往记忆 ",{"website":"carbondata.iteblog.com","name":"carbondata 中文文档 " ]', '{','\\\\;\\{'),'\\[ \\]',''),'\\;')); {"website":"www.iteblog.com","name":" 过往记忆 " {"website":"carbondata.iteblog.com","name":"carbondata 中文文档 " 现在我们已经能正确的解析 Json 数据了 你现在肯定不知道上面一堆的 SQL 是啥含义, 这里我来一步一步的解释 explode 函数只能接收数组或 map 类型的数据, 而 split 函数生成的结果就是数组 ; 第一个 regexp_replace 的作用是将 Json 数组元素之间的逗号换成分号, 所以使用完这个函数之后, [{"website":"www.iteblog.com","nam e":" 过往记忆 ",{"website":"carbondata.iteblog.com","name":"carbondata 中文文档 "] 会变成 [{"website":"www.iteblog.com","nam e":" 过往记忆 ";{"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_repl ace(regexp_replace('[{"website":"www.iteblog.com","name":" 过往记忆 ",{"website":"carbondat eblog.com","name":"carbondata 中文文档 "]', '\\\\,\\{','\\\\;\\{'),'\\[ \\]',' 3 / 5

'),'\\;')) as json) iteblog; 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 JSONencoded array to a Hive array of strings.") public class UDFJsonAsArray extends UDF { public ArrayList<String> evaluate(string jsonstring) { if (jsonstring == null) { try { JSONArray extractobject = new JSONArray(jsonString); ArrayList<String> result = new ArrayList<String>(); for (int ii = 0; ii < extractobject.length(); ++ii) { result.add(extractobject.get(ii).tostring()); return result; catch (JSONException e) { catch (NumberFormatException e) { 4 / 5

Powered by TCPDF (www.tcpdf.org) 上面的代码逻辑很简单, 我就不介绍了 将上面的代码进行编译打包, 假设打包完的 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'; Time taken: 0.013 seconds hive (default)> > select explode(json_array('[{"website":"www.iteblog.com","name":" 过往记忆 ",{"webs ite":"carbondata.iteblog.com","name":"carbondata 中文文档 "]')); {"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('[{"we bsite":"www.iteblog.com","name":" 过往记忆 ",{"website":"carbondata.iteblog.com","name":"ca rbta 中文文档 "]')) as json) iteblog; carbondata.iteblog.com carbondata 中文文档 Time taken: 0.082 seconds, Fetched: 2 row(s) 这个结果和上面使用 Hive 内置的函数结果一致 当然, 你还可以实现其他的 UDF, 逻辑和这个类似, 就不再介绍了 本博客文章除特别声明, 全部都是原创! 转载本文请加上 : 转载自过往记忆 (https://www.iteblog.com/) 本文链接 : () 5 / 5