Hive基础
参数设置
优先级: 配置文件 < 命令行参数 < 终端里输入命令
注意某些系统级的参数, 例如 log4j 的设定必须用前两种方式设定, 因为那些参数的读取在会话建立以前已经完成了。
- 配置文件方式 hive-default.xml 和 hive-site.xml
- 命令行参数方式 启动 Hive 时,hive -hiveconf mapred.reduce.tasks=10
- 终端里输入命令
set 查看所有配置
set xxx 查看xxx参数的值
set xxx 1 设置xxx参数的值
基础命令
hive -e “sql语句”
hive -f “sql文件路径”
分割符
Hive中默认的分割符为:
列:^A
行:\n
在数据文件中显示为:"1000^AHello, World!\n",数据中如果包含:"\001","\n"等分隔符,需要提前处理掉。
如果需要自定义分隔符,需要设置:
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
数据类型
基本数据类型
Hive 数据类型 | Java 数据类型 |
---|---|
TINYINT | byte |
SMALINT | short |
INT | int |
BIGINT | long |
BOOLEAN | boolean |
FLOAT | float |
DOUBLE | double |
STRING | string |
TIMESTAMP
String 类型相当于数据库的 varchar 类型, 该类型是一个可变的字符串,理论上它可以存储 2GB 的字符数
集合数据类型
- STRUCT struct<street:string, city:string>
- MAP map<string, int>
- Array array<string>
索引、分区与分桶
索引
Hive从0.7.0版本开始加入了索引,0.8版本后增加 bitmap 索引。索引表不会自动 rebuild,如果表有数据新增或删除,那么必须手动 rebuild 索引表数据
分区
表分区是指将数据按照物理分层的方式进行区分开,加快查询的速度,同时也起到数据快照的作用。可以指定单个字段也可以指定多个字段;
- 静态分区是在创建表时手动指定
- 动态分区是通过数据来进行判断,只有在 SQL 执行时才能确定。动态分区不能使用 load 加载数据,需要使用 insert into
默认创建的分区是静态分区,如果要指定动态分区需要配置系统参数。
桶
当单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,采用分桶技术将数据更细粒度的划分和管理。
分桶关键字:BUCKET
指定分桶的字段:clustered by (uid)
区别
- 分区使用的是表外字段,分桶使用的是表内字段
- 分桶是更细粒度的划分、管理数据,更多用来做数据抽样、JOIN操作
- 分区是粗粒度的将数据隔离,分桶是更加细粒度的将数据隔离
Table
create table if not exists bank_data ( age BIGINT comment '年龄', job STRING comment '工作类型', marital STRING comment '婚否', education STRING comment '教育程度', credit STRING comment '是否有信用卡', housing STRING comment '是否有房贷', loan STRING comment '是否有贷款', contact STRING comment '联系方式', month STRING comment '月份', day_of_week STRING comment '星期几', duration STRING comment '持续时间', campaign BIGINT comment '本次活动联系的次数', pdays DOUBLE comment '与上一次联系的时间间隔', previous DOUBLE comment '之前与客户联系的次数', poutcome STRING comment '之前市场活动的结果', emp_var_rate DOUBLE comment '就业变化速率', cons_price_idx DOUBLE comment '消费者物价指数', cons_conf_idx DOUBLE comment '消费者信心指数', euribor3m DOUBLE comment '欧元存款利率', nr_employed DOUBLE comment '职工人数', fixed_deposit BIGINT comment '是否有定期存款' );
Data
Load
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 ...)]
Load CSV
# 注意:Load CSV 并无报错,但导入皆为 NULL。一般 CSV 导入模式是先导入成 textfile, 之后再从临时表 insert 成 parquet。
- 有 LOCAL 表示从本地文件系统加载(文件会被拷贝到HDFS中)
- 无 LOCAL 表示从 HDFS 中加载数据(注意:文件直接被移动到 Hive 相应库下,而不是拷贝。)
- OVERWRITE 表示是否覆盖表中数据(或指定分区的数据)(没有 OVERWRITE 则 APPEND。)
- 若加载同样文件名的文件,会被自动重命名
另一种处理方式:将 CSV 格式转换为 Hive 格式
- cat bank.csv | sed "s/,/$PA/" > bank.hive # PA=OX001
- load data local inpath '/u01/data/bank.hive'
overwriteinto table test.bank_data;
Insert
hive> insert into test.test values ('1000', 'Hello World!');
注意
- order by 中的字段, 必须在 select 中出现
- 子查询表必须有别名