【Hive】——函数案例

1 Hive 多字节分隔符处理

1.1 默认规则

Hive默认序列化类是LazySimpleSerDe,其只支持使用单字节分隔符(char)来加载文本数据,例如逗号、制表符、空格等等,默认的分隔符为”\001”。根据不同文件的不同分隔符,我们可以通过在创建表时使用 row format delimited 来指定文件中的分割符,确保正确将表中的每一列与文件中的每一列实现一一对应的关系。

1.2 问题

  1. 每一行数据的分隔符是多字节分隔符,例如:”||”、“–”等
  2. 数据的字段中包含了分隔符

1.3 方案一:替换分隔符(不推荐)

直接解决数据问题,而不是解决了单字节分隔符问题,不推荐
在这里插入图片描述

1.4 方案二:RegexSerDe正则加载(推荐)

• 除了使用最多的LazySimpleSerDe,Hive该内置了很多SerDe类;
• 官网地址:https://cwiki.apache.org/confluence/display/Hive/SerDe
• 多种SerDe用于解析和加载不同类型的数据文件,常用的有ORCSerDe 、RegexSerDe、JsonSerDe等。
• RegexSerDe用来加载特殊数据的问题,使用正则匹配来加载数据。
• 根据正则表达式匹配每一列数据。
• https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-ApacheWeblogData

在这里插入图片描述

create table singer(id string,--歌手idname string,--歌手名称country string,--国家province string,--省份gender string,--性别works string)--作品
--指定使用RegexSerde加载数据
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES ("input.regex" = "([0-9]*)\\|\\|(.*)\\|\\|(.*)\\|\\|(.*)\\|\\|(.*)\\|\\|(.*)");
create table apachelog(ip string,      --IP地址stime string,    --时间mothed string,  --请求方式url string,     --请求地址policy string,  --请求协议stat string,    --请求状态body string     --字节大小
)
--指定使用RegexSerde加载数据ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
--指定正则表达式WITH SERDEPROPERTIES ("input.regex" = "([^ ]*) ([^}]*) ([^ ]*) ([^ ]*) ([^ ]*) ([0-9]*) ([^ ]*)") stored as textfile ;

2 URL解析函数

2.1 URL基本组成

在这里插入图片描述

2.2 parse_url函数

2.2.1 功能

parse_url函数是Hive中提供的最基本的url解析函数,可以根据指定的参数,从URL解析出对应的参数值进行返回,函数为普通的一对一函数类型。

2.2.2语法

parse_url(url, partToExtract[, key]) - extracts a part from a URL 
Parts: HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO key 

2.2.3 案例

SELECT parse_url('http://facebook.com/path/p1.php?id=10086', 'HOST');SELECT parse_url('http://facebook.com/path/p1.php?id=10086&name=allen', 'QUERY') ;SELECT parse_url('http://facebook.com/path/p1.php?id=10086&name=allen', 'QUERY', 'name') ;

在这里插入图片描述

selectid,parse_url(url,"HOST") as host,parse_url(url,"PATH") as path,parse_url(url,"QUERY") as queryfromtb_url;

在这里插入图片描述

2.3 parse_url_tuple

2.3.1 功能

parse_url_tuple函数是Hive中提供的基于parse_url的url解析函数,可以通过一次指定多个参数,从URL解析出多个参数的值进行返回多列,函数为特殊的一对多函数类型,即通常所说的UDTF函数类型。

2.3.2语法

parse_url_tuple(url, partname1, partname2, ..., partnameN) - extracts N (N>=1) parts from a URL.It takes a URL and one or multiple partnames, and returns a tuple.

2.3.3 案例

--建表
create table tb_url(id int,url string
)row format delimited
fields terminated by '\t';
--加载数据
load data local inpath '/root/hivedata/url.txt' into table tb_url;select * from tb_url;select parse_url_tuple(url,"HOST","PATH") as (host,path) from tb_url;select parse_url_tuple(url,"PROTOCOL","HOST","PATH") as (protocol,host,path) from tb_url;select parse_url_tuple(url,"HOST","PATH","QUERY") as (host,path,query) from tb_url;

在这里插入图片描述

3 UDTF函数问题

Hive中的一对多的UDTF函数可以实现高效的数据转换,但是也存在着一些使用中的问题,UDTF函数对于很多场景下有使用限制,例如:select时不能包含其他字段、不能嵌套调用、不能与group by等放在一起调用等等。

UDTF函数的调用方式,主要有以下两种方式:

3.1 直接在select后单独使用

--parse_url_tuple
selectid,parse_url_tuple(url,"HOST","PATH","QUERY") as (host,path,query)
from tb_url;

3.2 与Lateral View放在一起使用

--单个lateral view使用
selecta.id as id,b.host as host,b.path as path,b.query as query
from tb_url a lateral view parse_url_tuple(url,"HOST","PATH","QUERY") b as host,path,query;--多个lateral view
selecta.id as id,b.host as host,b.path as path,c.protocol as protocol,c.query as query
from tb_url alateral view parse_url_tuple(url,"HOST","PATH") b as host,pathlateral view parse_url_tuple(url,"PROTOCOL","QUERY") c as protocol,query;

4 Lateral View

如果UDTF不产生数据时,这时侧视图与原表关联的结果将为空

---Outer Lateral View
--如果UDTF不产生数据时,这时侧视图与原表关联的结果将为空
selectid,url,col1
from tb_urllateral view explode(array()) et as col1;

在这里插入图片描述
如果加上outer关键字以后,就会保留原表数据,类似于outer join


--如果加上outer关键字以后,就会保留原表数据,类似于outer join
selectid,url,col1
from tb_urllateral view outer explode(array()) et as col1;

在这里插入图片描述

5 行列转换

5.1 多行转多列(case when)

case when 函数:用于实现对数据的判断,根据条件,不同的情况返回不同的结果,类似于Java中的switch case 功能

CASE WHEN 条件1 THEN VALUE1
……
WHEN 条件N THEN VALUEN
ELSE 默认值  END
CASEWHEN V1 THEN VALUE1
……
WHEN VN THEN VALUEN
ELSE 默认值  END

5.2 多行转单列(concat_ws、collect_list、collect_set)

  1. concat_ws 函数: 用于实现字符串拼接,可以指定分隔符
    特点:任意一个元素不为null,结果就不为null
concat_ws(SplitChar,element1,element2……)
select concat_ws("-","itcast","And","heima");
+-------------------+
| itcast-And-heima  |
+-------------------+
select concat_ws("-","itcast","And",null);

±------------+
| itcast-And |
±------------+
2. collect_list 函数: 用于将一列中的多行合并为一行,不进行去重

collect_list(colName)
select collect_list(col1) from row2col1;

±---------------------------+
| [“a”,“a”,“a”,“b”,“b”,“b”] |
±---------------------------+
2. collect_set 函数: 用于将一列中的多行合并为一行,并进行去重

collect_set(colName)
select collect_set(col1) from row2col1;

±-----------+
| [“b”,“a”] |
±-----------+

5.3 多列转多行(union、union all)

5.4 单列转多行(explode)

6 json处理

6.1 概述

JSON数据格式是数据存储及数据处理中最常见的结构化数据格式之一,很多场景下公司都会将数据以JSON格式存储在HDFS中,当构建数据仓库时,需要对JSON格式的数据进行处理和分析,那么就需要在Hive中对JSON格式的数据进行解析读取。

6.2 JSON 函数处理

适用于将数据作为一个JSON字符串加载到表中,再通过JSON解析函数对JSON字符串进行解析

6.2.1 get_json_object

  1. 功能: 用于解析JSON字符串,可以从JSON字符串中返回指定的某个对象列的值
  2. 语法: get_json_object(json_txt, path) - Extract a json object from path
  3. json_txt:指定要解析的JSON字符串,path:指定要返回的字段,通过$.columnName的方式来指定path
  4. 特点:每次只能返回JSON对象中一列的值
    在这里插入图片描述
select--获取设备名称get_json_object(json,"$.device") as device,--获取设备类型get_json_object(json,"$.deviceType") as deviceType,--获取设备信号强度get_json_object(json,"$.signal") as signal,--获取时间get_json_object(json,"$.time") as stime
from tb_json_test1;

在这里插入图片描述

6.2.2 json_tuple

  1. 功能:用于实现JSON字符串的解析,可以通过指定多个参数来解析JSON返回多列的值
  2. 语法:json_tuple(jsonStr, p1, p2, …, pn) like get_json_object, but it takes multiple names and return a tuple
  3. 参数:jsonStr:指定要解析的JSON字符串;p1:指定要返回的第1个字段;pn:指定要返回的第n个字段
  4. 特点:功能类似于get_json_object,但是可以调用一次返回多列的值,属于UDTF类型函数,一般搭配lateral view使用,返回的每一列都是字符串类型
--json_tuple--单独使用
select--解析所有字段json_tuple(json,"device","deviceType","signal","time") as (device,deviceType,signal,stime)
from tb_json_test1;--搭配侧视图使用
selectjson,device,deviceType,signal,stime
from tb_json_test1lateral view json_tuple(json,"device","deviceType","signal","time") bas device,deviceType,signal,stime;

6.3 JSONSerde

Hive中为了简化对于JSON文件的处理,内置了一种专门用于解析JSON文件的Serde解析器,在创建表时,只要指定使用JSONSerde解析表的文件,就会自动将JSON文件中的每一列进行解析。
在这里插入图片描述

--JsonSerDe--创建表
create table tb_json_test2 (device string,deviceType string,signal double,`time` string
)ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'STORED AS TEXTFILE;load data local inpath '/root/hivedata/device.json' into table tb_json_test2;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qaxwidget传递参数到html,记一次QT使用QAxWidget打开.html文件调用显示离线百度地图不能缩放,自定义图片不能显示解决方法...

主要问题: 一开始用的是在线的,都没有什么问题,自定义图片均可以显示,可是后面试了一下离线百度地图,在qt中运行打开.html文件和在电脑上面直接双击打开此文件显示是有差别的,在qt生成的程序中,…

爬虫找工作要掌握什么_找爬虫工作必须掌握scrapy框架究竟什么?

十个爬虫九个python写,九个python爬虫全部由scrapy写。社会上在招聘爬虫工程师时,百分之百会需要掌握scrapy爬虫框架。但是scrapy十个什么东西你知道吗?什么是scrapy我们先看百科词条scrapyScrapy是我们熟知的爬虫框架,我们用scra…

性能计数器驱动_【Nature Sustainability】机械力驱动的摩擦电高效空气负离子发生器...

空气负离子被称为空气“维他命”,是一种电迁移率在1-2 cm2 V-1 S-1的小离子。就目前的科学研究表明,他们对空气中PM物质的净化,有害有机物的分解,以及细菌的抑制均具有重要的作用。除了自然界中在深林,瀑布和暴雨时产生…

内存缓存LruCache实现原理

自己项目中一直都是用的开源的xUtils框架,包括 BitmapUtils、DbUtils、ViewUtils和HttpUtils四大模块,这四大模块都是项目中比较常用的。最近决定研究一下 xUtils的源码,用了这么久总得知道它的实现原理吧。我是先从先从BitmapUtils模块开始的…

安装gem_Python安装第三方库及常见问题处理方法汇总

源码安装Python第三方库几乎都可以在github或者 pypi上找到源码。源码包格式大概有zip 、 tar.zip、 tar.bz2。解压这些包,进入解压好的文件夹,通常会有一个setup.py的文件。打开命令行,进入该文件夹。运行以下命令,就能把这个第三…

No style sheet with given id found错误

在chrome中打开html页面,报错No style sheet with given id found,解决方如下 转载于:https://www.cnblogs.com/lcyuhe/p/5439832.html

查询2021高考成绩位次,云南一分一段表查询2021-云南高考位次查询(文科、理科)...

云南高考一分一段表是同学们在填报高考志愿时的重要参考资料之一。根据一分一段表,大家不仅可以清楚地了解自己的高考成绩在全省的排名,还可以结合心仪的大学近3年在云南的录取位次变化,判断出自己被录取的概率大概是多少。根据考试院公布的数…

c语言goto语句用法_C语言32个关键字9种控制语句34种运算符整理

相信这么努力的你 已经星标了我 老九学堂 你身边的IT导师32个关键字,如下表所示:关键字说明auto声明自动变量short声明短整型变量或函数int声明整型变量或函数long声明长整型变量或函数float声明浮点型变量或函数double声明双精度变量或函数char声明字符…

人生苦短python作伴_“人生苦短,我用Python”

经过人机大战,AlphaGo一战成名,Python也确立了人工智能时代头牌开发语言的地位,国家相关教育部门更是把它纳入到了传统教育体系中。对于有跨界转型需求的小伙伴来说,get这门技能是个不错的切入点。这一篇文章,就来和大…

《Java编程思想》第四版读书笔记 第四章

2019独角兽企业重金招聘Python工程师标准>>> 4.3 逗号操作费仅用于for循环控制表达式的初始化部分和步进控制部分。初始化部分用于定义任意多个具有相同类型的变量&#xff1a; for(int i 1, j i 10; i <5; i, j i* 2) for循环控制表达式可以使用对象而不仅仅…

access 导入txt 找不到可安装的isam_由浅入深:Python 中如何实现自动导入缺失的库?...

? “Python猫” &#xff0c;一个值得加星标的公众号在写 Python 项目的时候&#xff0c;我们可能经常会遇到导入模块失败的错误&#xff1a;ImportError: No module named xxx或者ModuleNotFoundError: No module named xxx。导入失败问题&#xff0c;通常分为两种&#xff1…

英语计算机单词mp3,[听单词] 计算机专业英语词汇音频51,计算机英语单词MP3

calcd adj.已计算的interrupt data block&#xff0c;IDB 中断资料块ZBR Zero BRanch 零转移〖指令〗characteristic signal 特性信号processor cycle time 处理机周期时间plug-and-go integration 即插即拨集成relocating linkage loader n.浮动装入程序dispersiveness n.色散…

怎么判断私网地址_判断本机IP地址是公网地址还是私网地址

对于ip是否是公网ip&#xff0c;网上已经有很多文章进行了描述。但我每次都记不太住&#xff0c;总要查找一下才又清楚。因此决定在这里记录下来&#xff0c;方便以后查询&#xff1a;)ip地址分为五类。E类为保留为今后使用&#xff0c;D类为组播地址。用于主机网络地址的就是A…

pycharm中python版本_在 Pycharm(2019,.3)里配置 Anaconda3 的 Python 版本

先说配置方法&#xff1a; 一 在已有项目中配置&#xff1a; Virtualenv Environment 里选择 Existing environment 在 interpreter 输入或跟着路径找&#xff1a; /Users/***/opt/anaconda3/python.app/Contents/MacOS/python ***是用户名&#xff0c; 我这个应该默认的安装路…

Struts2 ActionWildcard(通配符配置)约定优于配置

新建web project&#xff1a;struts2_0500_actionwildcard Build Path 项目图&#xff1a; src&#xff1a; StudentAction.java TeacherAction.java struts.xml WebRoot: index.jsp Student_add.jsp Student_delete.jsp Student_edit.jsp Student_find.jsp …

html制作相册影集,用影集制作系统 轻松制作绚丽电子相册

“结庐在人境&#xff0c;而无车马喧。问君何能尔&#xff0c;心远地自偏。采菊东篱下&#xff0c;悠然见南山。山气日夕佳&#xff0c;飞鸟相与还。此中有真意&#xff0c;欲辨已忘言……”陶渊明先生以冲淡清远之笔&#xff0c;为我们描述了田园生活和虚里风光&#xff0c;利…

python3 gui协程_Python3进阶-协程

协程简介又称为微进程&#xff0c;纤程。非抢占式使用资源。优点优点1&#xff1a;协程极高的执行效率。因为子程序切换不是纤程切换&#xff0c;而是由程序自身控制&#xff0c;因此&#xff0c;没有纤程切换的开销&#xff0c;和多线程对比&#xff0c;纤程数量越多&#xff…

计算机主机ip地址题,计算机网络IP地址练习习题

IP地址习题1、192.168.1.1代表的是()地址。A、A类地址B、B类地址C、C类地址D、D类地址2、224.0.0.5代表的是()地址。A、主机地址B、网络地址C、组播地址D、广播地址3、192.168.1.255代表的是()地址。A、主机地址B、网络地址C、组播地址D、广播地址4、对于一个没有经过子网划分的…

实验一 线性表的顺序存储与实现_数据结构篇之单链表的创建以及实现

上次咱们已经一起分享了线性表的顺序存储的基本创建以及一些运算方法的实现&#xff0c;那么这次咱们主要来研究线性表的链式存储&#xff0c;俗称单链表&#xff0c;咱们知道顺序表在建立的时候要注意需要建立一块连续的空间&#xff0c;所以需要使用数组在内存中开辟空间&…

多线程基础(二)pthread的了解

IOS中多线程的实现方案 了解NSOperation&#xff08;代码&#xff09; 所有的方法都是pthread开头的 然后再搞一条线程 pthread_create方法有返回值&#xff0c;作用&#xff1a;判断线程创建是否成功&#xff1f; 常用的方法&#xff1a; 退出的方法: 关于pthread代码几乎不用…