对于日常的数据需求来说,熟悉Hive是一项必备的技能,因为很多日常的数据导出是不需要Spark任务的,跑一个HiveQL就可以完成,但秉承着知其然还要知其所以然的目的,我们首先来了解一下Hive相关的知识,然后熟悉一些日常HiveQL中可能用到的函数。
Hive用来作为原始数据和转换后数据的存储,简化ETL。
首先给出官方对于Hive的定义
The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.
从这段官方定义中,我们可以归纳Hive的如下特性:
Hive与数据仓库:
Hive是一个构建于Hadoop顶层的数据仓库工具
这里就不得不说到数据仓库的概念:
【目的】
主要是为了让MapReduce编程变得更容易,便于用户像使用SQL语句一样进行MapReduce的编程,非java编程者对hdfs的数据做MapReduce操作
【Hive特点需知】
【Hive架构】
Driver(驱动模块) - JVM进程,接收客户端请求,编译、解释、执行,负责的是把HiveQL翻译成MapReduce Job交给Yarn
Metastore(元数据) :包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。这部分存在的意义在于,我们知道数据在HDFS中是没有关系型数据库的表结构的
内置函数,这里列举部分开发中常用到的:
日期函数:
【日期与时间戳的转换】
函数 | 说明 |
---|---|
from_unixtime(bigint unixtime[, string format]) | 转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式 |
unix_timestamp() | 获得当前时区的UNIX时间戳 |
unix_timestamp(string date) | 转换格式为"yyyy-MM-dd HH:mm:ss"的日期到UNIX时间戳。 |
unix_timestamp(string date, string pattern) | 转换格式为"yyyyMMdd HH:mm:ss"的日期到UNIX时间戳。 |
select from_unixtime(1565452800,'yyyy-MM-dd')
res: 2019-08-11
select unix_timestamp()
res: 1565506410
select unix_timestamp('2019-08-11 00:00:00')
res: 1565452800
select unix_timestamp('20190811 11','yyyyMMdd HH')
res: 1565492400
【日期获取】
函数 | 说明 |
---|---|
to_date(string timestamp) | 返回日期部分 |
year(string date) | 返回年份 |
month(string date) | 返回月份 |
day(string date) | 返回天 |
hour(string date) | 返回小时 |
minute(string date) | 返回分钟 |
second(string date) | 返回秒 |
select to_date('2019-08-11 10:03:01')
res: 2019-08-11
select year('2019-08-11 10:03:01')
res: 2019
select month('2019-08-11 10:03:01')
res: 8
......
【日期比较】
函数 | 说明 |
---|---|
datediff(string enddate, string startdate) | 返回结束日期减去开始日期的天数 |
date_add(string startdate, int days) | 返回开始日期startdate增加days天后的日期 |
date_sub(string startdate, int days) | 返回开始日期startdate减少days天后的日期 |
select datediff('2019-08-11','2016-12-02')
res: 982
select date_add('2019-08-08',10);
res: 2019-08-18
字符串函数
函数 | 说明 |
---|---|
concat(string A, string B…) | 连接多个字符串 |
concat_ws(string SEP, string A, string B…) | 链接多个字符串,字符串之间以指定的分隔符分开。 |
substr(string A, int start) | 从文本字符串中指定的起始位置后的字符。 |
regexp_replace(string A, string B, string C) | 字符串A中的B字符被C字符替代 |
regexp_extract(string subject, string pattern, int index) | 通过下标返回正则表达式指定的部分 |
parse_url(string urlString, string partToExtract [, string keyToExtract]) | 返回URL指定的部分,选项包含[HOST,PATH,QUERY,REF,PROTOCOL,FILE,AUTHORITY,USERINFO] |
get_json_object(string json_string, string path) | |
split(string str, string pat) |
select concat('abc','iiii','ffff')
res: abciiiiffff
select concat_ws('~~','iiii','ffff')
res: iiii~~ffff
select substr('abcde',3)
res: cde
select regexp_replace('test20190812', '19|08', '')
res: test2012
select regexp_extract('test20190812', 'test(.*?)(0812)', 0), regexp_extract('test20190812', 'test(.*?)(0812)', 1), regexp_extract('test20190812', 'test(.*?)(0812)', 2)
res: test20190812 2019 0812
select parse_url('https://mooc.study.163.com/smartSpec/detail/1001485004.htm?utm_source=test.com', 'HOST') ,
parse_url('https://mooc.study.163.com/smartSpec/detail/1001485004.htm?utm_source=test.com', 'QUERY') ,
parse_url('https://mooc.study.163.com/smartSpec/detail/1001485004.htm?utm_source=test.com', 'PATH')
res:
"mooc.study.163.com"
"utm_source=test.com"
"/smartSpec/detail/1001485004.htm"
select get_json_object('{"store":{"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}', '$.owner')
res: amy1