【大数据】Java同学入门Hive编程 —— 简介和入门操作

【一】简介

对于日常的数据需求来说,熟悉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的如下特性:

  • 类似于SQL的查询
  • 将关系型数据库的结构映射到HDFS中
  • 提供命令行和JDBC连接

Hive与数据仓库:

Hive是一个构建于Hadoop顶层的数据仓库工具

这里就不得不说到数据仓库的概念:

  1. 与关系型数据库的区别:
    1. 数据库-交互式查询,
    2. 数据仓库-底层是MapReduce,不能搭载业务需求,多种数据源中的数据通过ETL,归整到同一个数据仓库中。
  2. 数据仓库中的数据不允许修改、删除

【目的】

主要是为了让MapReduce编程变得更容易,便于用户像使用SQL语句一样进行MapReduce的编程,非java编程者对hdfs的数据做MapReduce操作

【Hive特点需知】

  • 依赖HDFS存储
  • 依赖MapReduce处理数据
  • 提供类似SQL的查询(用户编程接口)
  • 批处理方式处理海量数据
  • 自身提供了ETL工具

【Hive架构】

Driver(驱动模块) - JVM进程,接收客户端请求,编译、解释、执行,负责的是把HiveQL翻译成MapReduce Job交给Yarn

Metastore(元数据) :包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。这部分存在的意义在于,我们知道数据在HDFS中是没有关系型数据库的表结构的

  • 编译器将一个Hive SQL转换操作符
  • 操作符是Hive的最小的处理单元
  • 每个操作符代表HDFS的一个操作或者一道MapReduce作业

【二】Hive常用函数

内置函数,这里列举部分开发中常用到的:

日期函数:

【日期与时间戳的转换】

函数 说明
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

你可能感兴趣的:(大数据,Hive,大数据)