hive操作大全

2020-01-09  本文已影响0人  云彩修建站站长

1. sql语句

1.1 创建表语句说明

有三种创建表的方法:

1.1.1 最常用创建方式

CREATE TABLE `hdp_mis_dd_defaultdb.a_realtime_call_detail35`(
  `rt_call_id` string COMMENT '业务id', 
  `rt_opp_id` string COMMENT '实时话务,商机id', 
  `rt_system_type` string COMMENT '用于区分实时话务的系统类型,JY-代表吉亚话务系统,HL-代表合力话务系统')
PARTITIONED BY ( 
  `partition_dt` string COMMENT 'yyyyMMdd,分区存储全量数据')
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\u0001 ' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://hdp-58-cluster/home/hdp_mis_dd/warehouse/hdp_mis_dd_defaultdb/a_realtime_call_detail35'
TBLPROPERTIES (
  'transient_lastDdlTime'='1512466921')

其中

STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

和STORED AS TEXTFILE一致,或者直接省略,默认也是TEXTFILE。

一共有四种存储格式:

  1. TEXTFILE
  2. SEQUENCEFILE
  3. RCFILE
  4. ORCFILE(0.11以后出现)

1.1.2 其他创建方式

  1. create table x as select * from ..
  2. create table x like table_a

1.2 从外部导入数据

1.2.1 外部表 & 内部表

如果不需要分开管理的话,没有必要使用外部表。

1.2.2 从本地导入数据

load data local inpath 'abs_path' into table {table_name};

1.2.3 从hdfs导入数据

load data inpath 'data/load_data_hdfs.txt' into table load_data_hdfs;

1.2.4 从其他表中导入数据

如果是想动态分区,需要加上下面的代码:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

1.3 导出数据

1.3.1 导出到本地文件系统

方案1:

INSERT OVERWRITE LOCAL DIRECTORY '/home/hadoop/output' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from testA;

方案2:

hive -e > target.file 后面跟语句 
hive -f > target.file 后面跟sql文件

1.3.2 导出到HDFS

和1.3.1相比,去掉了LOCAL

INSERT OVERWRITE DIRECTORY '/home/hadoop/output' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from testA;

1.4 alter修改

1.4.1 添加字段

alter table hdp_teu_dia_guessulike.ai_voice_check_voice_tab add columns(agent_no varchar (64));

1.4.2 修改字段

 alter table detail_flow_conversion_base_raw change column original_union_id original_union_id string COMMENT'原始设备唯一性标识’;

1.4.3 删除,增加分区

alter table table1 add partition(dt = '2019-02-12',du='1');
alter table table1 drop partition(dt = '2019-02-12');

2. 数据类型 和 内置函数

2.1 数据类型

## 整型:
tinyint — 微整型,只占用1个字节,只能存储0-255的整数。
smallint– 小整型,占用2个字节,存储范围–32768 到 32767。
int– 整型,占用4个字节,存储范围-2147483648到2147483647。
bigint– 长整型,占用8个字节,存储范围-2^63到2^63-1。

## 字符:
string 变长字符串
varchar 变长字符串,和string的区别是string是没有最大长度限制的,而varchar有。

## 日期
timestamp 时间戳,纳秒精度
date 日期,对应年月日,例如"2016-03-29"

2.2 内置函数

2.2.1 日期函数

日期相减
两个日期之间的差值:datediff(‘日期1’,’日期2’)
获取“日期1”和“日期2”之间的差值,日期的格式必须是:‘yyyy-MM-dd HH:mm:ss’或者‘yyyy-MM-dd’
增加,减少几天:日期的格式都是 YYYY-mm-dd

2.2.2 字符函数

image.png

2.2.3 条件函数

case...when... 条件表达式


image.png

3. 进阶

3.1 view表

1、视图是一个虚表,一个逻辑概念,可以跨越多张表。表是物理概念,数据放在表中,视图是虚表,操作视图和操作表是一样的,所谓虚,是指视图下不存数据。
2、视图是建立在已有表的基础上,视图赖以建立的这些表称为基表
3、视图可以简化复杂的查询

个人感觉,复杂地查询可以使用view标,复杂的sql简化成简单的sql。这种查询频率应该比较高才能用得到。

错误记录:

  1. 查询条件没有设置partition_dt而报错。
    如果设置了set hive.mapred.mode=strict,那么必须有where条件,里面要限制partition_dt,不然会报错。
no partition predicate found for alias
上一篇下一篇

猜你喜欢

热点阅读