Hive日常操作

模糊搜索表:show tables like '*name*';

查看表结构:desc table_name
查看表的详细信息:desc formatted table_name

查看分区信息:show partitions table_name;
根据分区查询数据:select table_coulm from table_name where partition_name = '2018-11-01';
删除分区:alter table table_name drop partition(dt='2018-11-01');

修改表名: alter table table_name rename to table_name_new;
复制表结构:CREATE TABLE table_name LIKE table_name_old;
添加字段:alter table table_name add columns(site_uv bigint comment '到站UV');

查看hdfs文件信息:dfs -ls /user/hive/warehouse/table_name;

查询结果导出到文件

1
2
3
4
5
6
7
8
insert overwrite local directory '/tmp/output' select * from table_name;
insert overwrite local directory '/tmp/output'
row format delimited fields terminated by ','
select * from table_name

-- 或者

hive -e 'select * from table_name' > /tmp/output

kill hive job:hadoop job -kill job_201811011453_58225

<> 这个符号是不等于的意思,相当于 !=

hive查询显示列名

1
2
3
set hive.cli.print.header=true; // 打印列名
set hive.cli.print.row.to.vertical=true; // 开启行转列功能, 前提必须开启打印列名功能
set hive.cli.print.row.to.vertical.num=1; // 设置每行显示的列数

从文件加载数据进表(OVERWRITE覆盖,追加不需要OVERWRITE关键字)

1
2
3
4
LOAD DATA LOCAL INPATH 'dim_config.txt' OVERWRITE into table default.dim_config;

--从查询语句给table插入数据
INSERT OVERWRITE TABLE dim_config PARTITION(ds) select * from default.dim_config_old where ds='2018-11-01';

仅复制表结构
CREATE TABLE new_table as select * from old_table where 1=0;

复制表结构和索引
CREATE TABLE new_table LIKE old_table;

自定义udf函数

  1. 继承UDF类
  2. 重写evaluate方法
  3. 把项目打成jar包
  4. hive中执行命令add jar /home/root/dw_etl/pub/udf/GetProperty.jar;
  5. 创建函数 create temporary function get_pro as ‘bi.Get_Property’;

开启简单模式不启用mr: set hive.fetch.task.conversion=more;

hive默认分隔符 \001

hive命令行中查看当前hive环境变量 !env

hive命令行中查看当前hive及hadoop环境变量 set -v

sqoop导出sequencefile格式的文件时需要特殊处理(自行百度),默认需要使用textfile

Hive将一行记录拆分成多行

1
2
3
select username,browse_product
from default.user_browse
lateral view explode(split(product, ',')) virtual_table_name as browse_product;

hive子查询时的错误Unsupported SubQuery Expression : Correlating expression cannot contain unqualified column references
原因:hive子查询列名要具有确定性,需要给表加个别名 select b from tablename t1 where t1.b in (select b from t2);

hive优化原则

  • hive优化原则,减小map数,减少job数

hive优化参数

1
2
3
4
5
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set mapred.max.split.size=268435456;
set hive.merge.size.per.task=268435456;
set hive.merge.smallfiles.avgsize=134217728;

hive异常定位

  • hive创建有分区到外部表时,一定要先增加分区,然后才能查到数据,如果不手动新增分区是查不到数据的 LTER TABLE adcall ADD IF NOT EXISTS PARTITION(day='$date', hou='$hour');
  • hive查询时需要估算下结果的大小,特别时有子查询时,会把查询结果存放到本地,防止中间结果太多硬盘满了
  • hive查询不动了,假死,首先查看NodeManager的日志,多半是NodeManager挂掉了,或者处于unhealthy state状态
  • job执行报错,可能就是nodemanager的问题,而不是resourcemanager的问题

动态导入分区数据:

1
2
3
4
5
6
7
导一天的数据可以这样
insert into new_table_name partition (ds='2018-12-15')
select * from old_table_name where ds='2018-12-15'

-- 导入多天的数据
insert into new_table_name partition (ds)
select * from old_table_name where ds >= '2018-12-15'

JouyPub wechat
欢迎订阅「K叔区块链」 - 专注于区块链技术学习