Hive数据操作
1.装载数据
LOAD DATA [LOCAL] INPATH '/.../...'//INPATH这个路径下不可以包含任何文件夹
OVERWRITE INTO TABLE <table>
PARTITOIN(...); //若分区不存在,会先创建分区,再拷贝数据;非分区表,则省略
2.通过查询语句向表中插入数据
INSERT OVERWRITE TABLE <table> //OVERWRITE覆盖,INTO追加
PARTITION (partition1 = '', parttiion2 = '')
SELECT * FROM <table> t
WHERE t.par1 = '' AND t.par2 = '';
//若源数据表非常大,分区也很多,使用以下语句,只扫描一次输入数据,然后按多种方式进行划分
FROM <from_table> f
INSERT OVERWRITE TABLE <to_table>
PARTITION (par1 = '1', par2 = '1')
SELECT * FROM WHERE f.par1 = '1' AND f.par2 = '1'
INSERT OVERWRITE TABLE <to_table>
PARTITION (par1 = '1', par2 = '2')
SELECT * FROM WHERE f.par1 = '1' AND f.par2 = '2'
INSERT OVERWRITE TABLE <to_table>
PARTITION (par1 = '1', par2 = '3')
SELECT * FROM WHERE f.par1 = '1' AND f.par2 = '3';
3.动态分区插入
如果分区很多,就需要动态分区功能,基于查询参数推断出需要创建的分区名称,即源表字段值和输出分区值之间关系是根据位置而不是根据命名来匹配的
INSERT OVERWRITE TABLE <to_table>
PARTITION(par1, par2)
SELECT ..., f.par1, f.par2
FROM <from_table> f;
//静态分区键必须出现在动态分区键之前
INSERT OVERWRITE TABLE <to_table>
PARTITION(par1 = '1', par2)
SELECT ..., f.par1, f.par2
FROM <from_table> f
WHERE f.par1 = '1';
动态分区默认情况没有开启,开启后,默认是以"严格"模式执行的,在这种模式下要求至少有一列分区字段是静态的。
4.单个查询语句中创建表并加载数据
//不能用于外部表
CREATE TABLE <table>
AS SELECT col1, col2
FROM <from_table> f
WHERE s.col = '';
5.导出数据
hadoop fs -cp source_path target_path
也可以使用 INSERT ...DIRECTORY ...
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/...'
SELECT col1, col2, col3
FROM <table> t
WHERE t.par1 = '...';
指定多个输入文件夹目录
FROM staged_table st
INSERT OVERWRITE DIRECTORY '/tmp/1'
SELECT * FROM st.par1 = '1' AND st.par2='1'
INSERT OVERWRITE DIRECTORY '/tmp/2'
SELECT * FROM st.par1 = '1' AND st.par2='2';
新闻热点
疑难解答