hive 数据操作

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 中没有临时表的概念,用户需要手动删除任何创建了但有不想长期保留的表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值