Hive 一些操作记录

1.创建

//创建数据库
create database database_name

//创建表 列按‘,’分割
create table table_name(id int,name string) row format delimited fields terminated by ','

//创建分区表 列按‘,’分割 按bt和country分区
//create external table if not exists 判断表是否存在
create external table if not exists table_name(id int,name string)
partitioned by (dt String,country string)
row format delimited fields terminated by ','

//添加分区
alter table table_name add if not exists partition (dt='xxx',country 
='xxx')

2.查看

//查询所有数据库
show databases

//查询所有表
show tables

//查看表结构
desc formatted table_name

hbase映射表

3.加载数据

//local关键字 没有local关键字,则加载hdfs上的文件 有local关键字,则加载本地文件 
//overwrite关键字 覆盖数据(清空原数据)
//分区表,则加上partition分区
load data [local] inpath 'filepath' [overwrite] into table table_name [partition(part=val,part2=val2)]

//加载hdfs数据
load data inpath '/hdfsPath' into table table_name

//加载本地数据
load data load inpath '/path' into table table_name

4.查询

select * from table_name

//查询分区表 where 后面加分区条件,这样做是不会扫描全表 只会查询该分区
select * from table_name where dt='xxx'

5.删除,清空

//删除数据库
DROP DATABASE if EXISTS table_name

//删除表 
DROP TABLE if EXISTS table_name

//清空分区表 表结构还在,只清空数据
ALTER TABLE table_name DROP IF EXISTS PARTITION (dt='2018-08',country='CH')

6.重命名

//重命名表名
ALTER TABLE table_name_old RENAME TO table_name_new

//重命名列名
ALTER TABLE table_name CHANGE col_old_name col_new_name STRING;

7.导出文件

//导出文件到hdfs上 按照‘,’分割 
//overwrite关键字 会覆盖目录下的原数据
INSERT OVERWRITE directory '/hdfsPath' row format delimited fields terminated by ','  SELECT * from table_name

8.无效ID在关联时的数据倾斜问题

  • 解决方法:函数过滤 null

把空值的id变成一个字符串加上随机数,就能把倾斜的数据分到不同的Reduce上,从而解决数据倾斜问题。因为空值不参与关联,即使分到不同 的 Reduce 上,也不会影响最终的结果。

SELECT * FROM tableName1 a LEFT OUTER 
JOIN tableName2 b ON 
CASE WHEN a.id IS NULL THEN CONCAT('hive_temp_id',RAND()) ELSE a.id END =b.user_id;

9.Hive不允许直接访问非group by字段

  • 对于非group by字段,可以使用collect_set函数收集这些字段,返回一个数组;
SELECT a,b FROM tableName GROUP BY a	//Expression not in GROUP BY key 'b'

SELECT a,collect_set(b) FROM tableName GROUP BY a	//正确的使用方式
  • collect_set函数的其他用法:

使用数字下标,可以直接访问数组中的元素

10.控制map和reduce数量

  • 控制map
set mapred.max.split.size=256000000;   //每个Map处理的最大输入文件大小(256MB)
set mapred.min.split.size.per.node=1;  //节点上split文件的最小值
set mapred.min.split.size.per.rack=1;  //机架上split文件的最小值
  • 控制reduce
//方法一
set mapred.reduce.tasks=10;  //设置reduce的数量
//方法二
set hive.exec.reducers.bytes.per.reducer=1073741824 //每个reduce处理的数据量,默认1GB

10.hive join 优化的方式

  • map join
set hive.auto.convert.join=true //自动MAPJOIN转换操作(common join转换为map join

12.合并小文件

 hive.merge.mapfiles = true	//和并 Map 输出文件,默认为 True
 hive.merge.mapredfiles = false //合并 Reduce 输出文件,默认为 False
 hive.merge.size.per.task = 256*1000*1000 //合并文件的大小。

13.并行执行优化

set hive.exec.parallel=true; //开启任务并行执行
set hive.exec.parallel.thread.number=8; //同一个sql允许并行任务的最大线程数
set hive.groupby.skewindata=true; //设置数据负载均衡,防止数据倾斜
set hive.ignore.mapjoin.hint=false;	//不忽略MAPJOIN标记
set mapred.reduce.tasks=15;	//设置reduce的数量
set hive.exec.reducers.max=200;	//reduce最大数量(默认999)
set hive.auto.convert.join=false;	//自动MAPJOIN转换操作(common join转换为map join)
set hive.exec.compress.intermediate=true; //hive的压缩设置,中间结果压缩  
set hive.map.aggr = true;	//map中做部分聚集操作(默认true)
set hive.execution.engine=tez;	//更改hive底层执行的计算框架                        

填坑中

你可能感兴趣的:(hive)