hive 版本 1.2.2
向表中装载数据
1、LOAD DATA LOCAL INPATH ‘/tmp/data.csv’ OVERWRITE INTO TABLE test PARTITION(year=’2017’,month=’1’);
LOCAL 关键字,加载本地的数据,如果不加这个关键字,就是加载hdfs上的文件
如果test 表没有分区表,需要去掉partition()。
OVERWRITE 关键字对于外部表或者内部表,表现的效果是一样的,使用就是覆盖数据,不使用就是追加数据
不使用关键字OVERWRITE ,hdfs上的文件这里需要说明下,如果加载的文件名和以前的文件名相同,那么hdfs上会保留原有的文件,然后产生一个相同的文件名加上”_copy_n” 这样的后缀。如果加载的文件名和以前的文件名不相同,直接将此文件复制到指定的目录(表/分区存储的目录)
如果是分区表,使用OVERWRITE 就会覆盖当前分区表,不是用OVERWRITE 关键字同样数据会追加至当前分区
LOAD DATA LOCAL INPATH ‘/tmp/data.txt’ INTO TABLE stocks; #将这个命令运行多次
LOAD DATA LOCAL INPATH ‘/tmp/data1.txt’ INTO TABLE stocks
[root@master tmp]# hadoop fs -ls /user/hive/stocks
Found 4 items
-rwxr-xr-x 3 root supergroup 96 2018-01-31 06:06 /user/hive/stocks/data.txt
-rwxr-xr-x 3 root supergroup 48 2018-01-31 06:30 /user/hive/stocks/data1.txt
-rwxr-xr-x 3 root supergroup 96 2018-01-31 06:07 /user/hive/stocks/data_copy_1.txt
-rwxr-xr-x 3 root supergroup 96 2018-01-31 06:26 /user/hive/stocks/data_copy_2.txt
2、使用查询一个表所得的数据插入到另一个表中
hive (mydb)> INSERT OVERWRITE TABLE test_partition
> PARTITION(month = 1,year = 2017)
> SELECT id,num,day FROM test
> WHERE year=2017 AND month=1;
2017年有12个月,这样需要执行12次这样类似的命令,实际上可以执行1次这样的命令
FROM test
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 1,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=1
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 2,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=2
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 3,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=3
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 4,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=4
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 5,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=5
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 6,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=6
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 7,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=7
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 8,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=8
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 9,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=9
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 10,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=10
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 11,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=11
INSERT OVERWRITE TABLE test_partition
PARTITION(month = 12,year = 2017)
SELECT id,num,day WHERE year=2017 AND month=12;
这里可以将INSERT INTO 或者INSERT OVERWRITE 混合使用
3、动态分区插入数据
如果分区很多的话就需要写很多的sql,这样的操作是令人悲哀的,好在hive支持动态分区的功能。默认的情况下静态分区
动态分区属性
属性名称 默认值 描述
hive.exec.dynamic.partition flase 设置成true,表示开启动态分区功能
hive.exec.dynamic.partition.mode strict 设置成nonstrict,表示所有分区都是动态的
hive.exec.max.dynamic.partitions.pernode 100 每个map和reduce 可以创建最大的动态分区个数
hive.exec.max.dynamic.partitions +1000 一个动态分区语句能够创建最大动态分区的个数
hive.exec.max.created.files 100000 全局可以创建的最大文件个数
hive (mydb)> set hive.exec.dynamic.partition=true;
hive (mydb)> set hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE test_partition
PARTITION (month,year)
SELECT id,num,day,month,year
FROM test;
这条语句的效果类似第2条那一长串sql语句
4、单个查询语句中创建表并加载数据
CREATE TABLE test3
AS SELECT id,num,day
FROM test
WHERE month = 1;
这种适合从一个宽表选取部分需要的数据集
但是这里不能通过一个现有的表(无论原表是外部表还是内部表)来创建一个外部表,否则会报错
CREATE EXTERNAL TABLE test4 AS SELECT id,num,day FROM test WHERE month = 1;
这条语句就会报错
导出数据
1、如果数据文件恰好是用户需要的格式,那么只需要执行拷贝动作就可以了
hadoop fs -cp source _path target_path
2、也可以按需定制格式
INSET OVERWRITE LOCAL DIRECTORY ‘/some/path/to’
SELECT name,salary,addree
FROM employess
WHERE state=’CA’;
(1) 指定路径也可以写成全URL 路径(例如:hdfs://master:9001/some/path/to)
(2) 一个或者多个文件写入/some/path/to 这个目录下,具体文件的个数取决于reduce的个数
(3) 不管在源表中数据实际是怎么存储的,hive会将所有的字段序列化成字符串写入到文件中。Hive使用和Hive内部存储的表相同的编码方式生成输出文件
(4) 像表中插入数据一样,用户可以一次指定多个输出目录
FROM source_table
INSERT OVERWRITE DIRECTORY '/some/path/to1'
SELECT * WHERE CLOUMN1 = EXPRESSON1
INSERT OVERWRITE DIRECTORY '/some/path/to2'
SELECT * WHERE CLOUMN2 = EXPRESSON2
.........
(5) 对于定制输出的数据有些限制,但可以自行定义OUTPUTFORMAT,需要使用hive内置函数来解决。这个等留到hive内置函数那篇在详细说明
(6) 表的字段分隔符需要考虑,hive 默认使用^A 作为字段的分隔符,而用户导出的数据可能希望使用\t分隔符
(7) 还可以建立一个临时表,存储方式配置期望的输出格式,然后再从这个临时表中查询数据,并使用INSERT OVERWRITE DIRECTORY 将查询的结果写入到这个表中。Hive 中没有临时表的概念,用户需要手动删除任何创建了但有不想长期保留的表