【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物质的净化,有害有机物的分解,以及细菌的抑制均具有重要的作用。除了自然界中在深林,瀑布和暴雨时产生…

安装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声明字符…

《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.色散…

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

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

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

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

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

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

iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例

使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能&#xff1a; 1.使用StoryBoard实现 2.纯代码实现 前言&#xff1a;手机屏幕始终有限&#xff0c;如何在有限的展示空间提供便捷的导航入口呢&#xff1f;Facebook…

绘图的尺寸_Auto CAD机械绘图尺寸标注教程1(尺寸标注简介)

1、尺寸是工程图中不可缺少的一项内容&#xff0c;工程图中的图形只用来标识工程图形的形状&#xff0c;而工程形体的大小尺寸是靠尺寸来说明的&#xff0c;所以工程图图中尺寸必须标注得正确、完整、清晰、合理。工程图中尺寸标注包括&#xff1a;尺寸界线、尺寸线、尺寸起止符…

java并发核心知识体系精讲_Java 面试突击之 Java 并发知识基础 amp; 进阶考点全解析

版权说明&#xff1a;本文内容根据 github 开源项目整理所得项目地址&#xff1a;https://github.com/Snailclimb/JavaGuide​github.com一、基础什么是线程和进程?何为进程?进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。系统…

运用python的方式_对Python使用mfcc的两种方式详解

1、Librosa import librosa filepath "/Users/birenjianmo/Desktop/learn/librosa/mp3/in.wav" y,sr librosa.load(filepath) mfcc librosa.feature.mfcc( y,sr,n_mfcc13 ) 返回结构为(13,None)的np.Array&#xff0c;None表示任意数量 2、python_speech_features…

nginx加载图片慢_优化vue项目的首屏加载速度

最近使用vue-cli3构建了一个小型的博客系统&#xff0c;完工之后&#xff0c;build打包出来发现一个chunk-vendors包就有1.1m&#xff0c;部署上去之后&#xff0c;访问的时候&#xff0c;首屏加载非常慢。居然需要21s&#xff0c;体验极差。这是打包的结果截图根据这种情况&am…

micropython移植教程_【教程】智能编程T-Watch手表初试micropython之电子秤教程

原标题&#xff1a;【教程】智能编程T-Watch手表初试micropython之电子秤教程 【项目的故事】 在极客玩具中&#xff0c;我一直喜欢穿戴类和小车类。前后做过两只运动心率表&#xff0c;并且参与过麦步手表的测试。TTGO最新出品了一块叫做T-Watch的手表&#xff0c;实际上&…

音乐和计算机跨界融合,音乐类综艺跨界融合有了新思路

图集8月9日《人民日报》刊文&#xff0c;对原创综艺节目《幻乐之城》匠心做原创的新思路、新经验、新趋势进行了表扬&#xff0c;文章指出&#xff1a;“音乐电影”的节目模式在呈现出音乐与电影双重质感的同时&#xff0c;也为国内音乐类综艺节目的跨界融合发展提供了新的思路…