1、Hive常用表操作语句
A、创建Hive内部表
CREATE TABLE `table_name`(
`sku_id` string COMMENT 'sku_id',
`brand_code` bigint COMMENT '品牌code',
`item_first_cate_cd` string COMMENT '一级品类',
`item_second_cate_cd` string COMMENT '二级品类',
`item_third_cate_cd` string COMMENT '三级品类')
COMMENT '测试表'
PARTITIONED BY (
`dt` string COMMENT 'yyyy-MM-dd') --- 时间分区
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde' --- ORC表格式
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
注意:当数据删除的时候 表元数据和真实数据 都会被删除
表名重命名:
alter table table_name rename to table_name1;
加载历史数据:
1、INSERT OVERWRITE 会覆盖当前分区所有数据
2、INSERT INTO 会追加数据到当前分区,不会覆盖
3、PARTITION(DT) 指定分区为DT, 也可 PARTITION(DT=‘2023-01-01’) 如果这样写 SELECT后面就无需写DT字段列
INSERT OVERWRITE TABLE TABLE_NAME_B PARTITION(DT)
SELECT
SKU_ID,
SKU_NAME,
DT
FROM TABLE_NAME_A
如果无分区:
INSERT OVERWRITE TABLE TEST.TABLE_B
SELECT
SKU_ID,
SKU_NAME,
......
FROM TABLE_A
B、表列常规操作
增加一个列:
alter table table_name add columns(user_id bigint comment '用户ID');
编辑一个列:
# 将性别(name)名称改成sku_name,类型改成string,注释改成“商品名称”
alter table table_name change name sku_name string comment '商品名称';
# 将sku_name字段类型改为string,并将位置移动到sku字段后面
alter table table_name change sku_name sku_name string comment '商品名称' after sku;
2、Hive常用函数使用
Json解析:
1)get_json_object
select get_json_object('{"movie":"594","rate":"4"}','$.movie');
2)json_tuple【适合一次解析多个Key】
select b.b_movie,
b.b_rate,
b.b_timeStamp,
b.b_uid
from json a
lateral view json_tuple(a.data,'movie','rate','timeStamp','uid') b as b_movie,b_rate,b_timeStamp,b_uid
Map结构解析:
1)生成Map结构数据
select map('a','1','b','2');
结果:{"a":"1","b":"2"}
select map('key1',str_to_map('a:1,b:2',',',':'),'key2',str_to_map('a:1,b:2',',',':'));
结果:{"key1":{"a":"1","b":"2"},"key2":{"a":"1","b":"2"}}
2)获取某个Key的值
select map("key1", 1, "key2", 2, "key3", "dd")['key1'] as v1
结果:1
3)Map长度
select size(map("key1", 1, "key2", 2, "key3", "dd")) as v1
结果:3
Array结构解析:
1)explode【行转列】
输入: 1 sku1,sku2,sku3
select
sku,
sale_qty
from
sku_table
lateral view explode(split(sku_list,',')) t as sku
结果:
sku1 1
sku2 1
sku3 1
2)posexplode
select
sku_index + 1 as sku_index,
sku_name
from
(
select 'sku2,sku1,sku3' as sku_list
) a
lateral view posexplode(split(sku_list,',')) t as sku_index,sku_name
结果:按照字符串的顺序排序,+1是因为索引从0开始,使其从1开始
3)多列Explode
select
sku,
sku_name
from
(
select 'sku1,sku2,sku3' as sku_list,
'sku_name1,sku_name2,sku_name3' as sku_name_list
) a
lateral view explode(split(sku_list,',')) sn as sku
lateral view explode(split(sku_name_list,',')) sc as sku_name
结果:
3、Hive的Archive数据的归档
1、Arichive文件是一个打包文件,但是不会对文件进行压缩
2、Arichive文件归档之后,我们还可以透明的访问其中的每一个小文件
3、Archive主要解决HDFS不擅长存储小文件问题
4、Archive过程是一个MapReduce任务
5、Archive之后,原来的文件依然保留
涉及参数:
hive> set hive.archive.enabled=true;
hive> set hive.archive.har.parentdir.settable=true;
hive> set har.partfile.size=1099511627776;
归档命令:
ALTER TABLE srcpart ARCHIVE PARTITION(ds='2008-04-08', hr='12')
解压命令:
ALTER TABLE srcpart UNARCHIVE PARTITION(ds='2008-04-08', hr='12')
问题注意:如果报错 java.lang.NoClassDefFoundError:org/apache/hadoop/tools/HadoopArchives
说明Hive Lib缺少归档jar包,从Hadoop的Lib目录下拷贝Archive相关类到Hive的Lib下面,利用下面的命令查找归档jar包
find /data1/hadoop/hadoop/ -name *archive*