基础命令
show databases; # 查看某个数据库
use 数据库; # 进入某个数据库
show tables; # 展示所有表
desc 表名; # 显示表结构
show partitions 表名; # 显示表名的分区
show create table_name; # 显示创建表的结构
use xxdb; create table xxx;
create table xxx like xxx;
use xxdb; create external table xxx;
use xxdb; create external table xxx (l int) partitoned by (d string)
alter table table_name set TBLPROPROTIES (‘EXTERNAL’=‘TRUE’); # 内部表转外部表
alter table table_name set TBLPROPROTIES (‘EXTERNAL’=‘FALSE’);# 外部表转内部表
use xxxdb; alter table table_name rename to new_table_name;
alter table table_name add columns (newcol1 int comment ‘新增’);
alter table table_name change col_name new_col_name new_type;
alter table table_name replace columns (col1 int,col2 string,col3 string);
use xxxdb; drop table table_name;
alter table table_name drop if exists partitions (d=‘2016-07-01’);
复合数据类型
create table person(name string,work_locations array)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
COLLECTION ITEMS TERMINATED BY ‘,’;
biansutao beijing,shanghai,tianjin,hangzhou
linan changchu,chengdu,wuhan
LOAD DATA LOCAL INPATH ‘/home/hadoop/person.txt’ OVERWRITE INTO TABLE person;
select * from person;
create table score(name string, score map
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
COLLECTION ITEMS TERMINATED BY ‘,’
MAP KEYS TERMINATED BY ‘:’;
biansutao ‘数学’:80,‘语文’:89,‘英语’:95
jobs ‘语文’:60,‘数学’:80,‘英语’:99
LOAD DATA LOCAL INPATH ‘/home/hadoop/score.txt’ OVERWRITE INTO TABLE score;
select * from score;
CREATE TABLE test(id int,course structcourse:string,score:int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
COLLECTION ITEMS TERMINATED BY ‘,’;
//结构体数据,每个元素都是 字段名:值的形式存在的
1 english,80
2 math,89
3 chinese,95
LOAD DATA LOCAL INPATH ‘/home/hadoop/test.txt’ OVERWRITE INTO TABLE test;
select * from test;
配置优化
set hive.exec.parallel=true
set mapreduce.map.memory.mb=1024;
set mapreduce.reduce.memory.mb=1024;
set mapreduce.job.queuename=jppkg_high;
set hive.optimize.sort.dynamic.partition=false;
set hivevar:factor_timedecay=-0.3;
set hivevar:pre_month= z d t . a d d D a y ( − 30 ) . f o r m a t ( " y y y y − M M − d d " ) ; s e t h i v e v a r : p r e d a t e = {zdt.addDay(-30).format("yyyy-MM-dd")}; set hivevar:pre_date= zdt.addDay(−30).format("yyyy−MM−dd");sethivevar:predate={zdt.addDay(-1).format(“yyyy-MM-dd”)};
set hivevar:cur_date=${zdt.format(“yyyy-MM-dd”)};
add jar ***.jar;
hive.exec.compress.output=true
hive.hadoop.suports.splittable.combineinputformat
hive.groupby.skewindata
hive.optimize.skewjoin
hive.map.aggr – 默认打开
hive.groupby.mapaggr.checkinterval – 在Map端进行聚合操作的条目数目
hive.multigroupby.singlemr
hive.optimize.index.filter
常用函数
if (boolean condition, T A, T B)
case a when b then c when d then e else f end
get_json_object(string s, ‘$.key’)
例子:create table json (data string) ;
json格式数据文件:{“name”:“lisi”}
加载到表中,select (data,’$.name’) from json;
返回lisi
parse_url()
explode(colname)
select pageid, adid from pageAds
lateral view explode(adid_list) adTable as adid
trim()
lower(), upper()
coalesce(v1, v2, v3, …)
from_unixtime(unix_timestamp(), ‘yyyy-MM-dd HH:mm:ss’)
instr(string str, string search_str)
concat(string A, string B, string C, …)
concat_ws(string sep, string A, string B, string C, …)
length()
reverse()
substring(string A, int start, int len)
regexp_replace(string A, string pat, string C)
regexp_extract(string subject, string pattern, int index)
split(string str, string pat)
cast(expr as type)
str_to_map(string A, string item_pat, string dict_pat)
map_keys(map m)
datediff(date1, date2)
HQL和SQL的差异点
exchange
from xxdb.xxtb;基本概念
hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库库表,并提供类SQL查询功能。
用户接口:CLI,shell命令行;JDBC/ODBC是hive的java实现;webGUI是通过浏览器访问hive;
元数据存储:通常是存储在关系数据库如mysql, derby中;hive的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表),表的数据所在目录等。
解释器,编译器,优化器完成HQL查询语句从词法分析,语法分析,编译,优化以及查询计划的生成。生成的查询存储在HDFS中,并随后有mapreduce调用执行。
因此,hive与Hadoop的关系可以理解为用户发出SQL查询语句,hive将查询存储在HDFS中,然后由mapreduce调用执行。
Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据。例如,一个表 pvs,它在 HDFS 中的路径为:/wh/pvs,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的 Table 数据(不包括 External Table)都保存在这个目录中。
Partition 对应于数据库中的 Partition 列的密集索引,但是 Hive 中 Partition 的组织方式和数据库中的很不相同。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中。例如:pvs 表中包含 ds 和 city 两个 Partition,则对应于 ds = 20090801, ctry = US 的 HDFS 子目录为:/wh/pvs/ds=20090801/ctry=US;对应于 ds = 20090801, ctry = CA 的 HDFS 子目录为;/wh/pvs/ds=20090801/ctry=CA
Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。将 user 列分散至 32 个 bucket,首先对 user 列的值计算 hash,对应 hash 值为 0 的 HDFS 目录为:/wh/pvs/ds=20090801/ctry=US/part-00000;hash 值为 20 的 HDFS 目录为:/wh/pvs/ds=20090801/ctry=US/part-00020
External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition。它和 Table 在元数据的组织上是相同的,而实际数据的存储则有较大的差异。
Table 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。
External Table 只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在 LOCATION 后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个 External Table 时,仅删除元数据,表中的数据不会真正被删除。
查看分区信息
如果分区的大小随时间增加而增加,则最新的分区为全量数据
如果分区的大小随时间增加而大小上下变化,则每个分区都是增量数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
实际使用
insert overwrite table table_name partition (d=’${pre_date}’)
drop table if exists employees;
create table if not exists employees(
name string,
salary float,
subordinate array,
deductions map
address structstreet:string,city:string,num:int
) partitioned by (date_time string, type string)
row format delimited
fields terminated by ‘\t’
collection items terminated by ‘,’
map keys terminated by ‘:’
lines terminated by ‘\n’
stored as textfile
location ‘/hive/…’;
create table bucketed_user(id int, name string)
clustered by (id) sorted by (name) into 4 buckets
row format delimited
fields terminated by ‘\t’
stored as textfile;
set hive.enforce.bucketing=true;
insert overwrite table bucketed_user select salary, name from employees
如果字段类型是string,则通过get_json_object提取数据;
如果字段类型是struct或map,则通过col[‘xx’]方式提取数据;
shell指令
#!/bin/bash
hive -e “use xxxdb;”
cnt = hive -e "..."
echo “cnt=${cnt}”
for ((i=1; i<=10; i+=1))
do
pre_date=date -d -${i}days +%F
done
pre_date=date -d -1days +%F
pre_week=date -d -7days +%F
export JAVA_HOME=jdk;
复合数据结构map, struct, array用法,非常用函数介绍:https://my.oschina.net/leejun2005/blog/120463
regexp_extract: https://www.cnblogs.com/skyEva/p/5175377.html
lateral view和explode: https://blog.csdn.net/bitcarmanlee/article/details/51926530
基本概念:分区,桶…:https://blog.csdn.net/gamer_gyt/article/details/47210331
作者:韦人人韦
来源:CSDN
原文:https://blog.csdn.net/ddydavie/article/details/80667727
版权声明:本文为博主原创文章,转载请附上博文链接!