HiveQL:加载、导出数据

1、向管理表中装载数据

使用load data的方式往表批量加入(Hive不支持行级别的数据操作),有几点需要注意:

  • local:是从本地文件系统拷贝数据到分布式文件系统上的目标位置,如Hive默认的/user/hive/warehouse/路径下。不带local关键字,是从分布式文件系统上转移到分布式文件系统上的目标位置,如从/home/hadoop到/user/hive/warehouse/,同时要求是在同一个文件系统
  • overwrite:会覆盖掉表中原有的数据。不带overwirte关键字,则是追加写入表
  • inpath:指定的路径必须是文件夹,而不是具体的文件名,而且该路径下不能再含有任何文件夹
  • 文件夹下有多个文件,都会被导入到同一张表
  • 目标表不是分区表,不能使用partition子句加载数据
LOAD DATA LOCAL INPATH '/Users/amber/Desktop/input/cast/m' -- 本地路径
OVERWRITE INTO TABLE cast
PARTITION (gender='m');  -- 按性别分区

  

2、通过查询语句向表中插入数据

2.1 静态分区写入

通过INSERT语句可以很方便的写入数据,但同样有需要注意的地方:

  • overwrite:会覆盖表中原有的数据(分区表则是对应的分区数据被覆盖)
  • into:追加写入数据,不覆盖原表数据
  • 两个表字段不同,可以通过into和指定字段追加写入数据,但不能使用overwrite覆盖数据
INSERT OVERWRITE TABLE cast1
PARTITION(gender='m')
SELECT * FROM cast
WHERE gender='m';

INSERT INTO TABLE cast1
PARTITION(gender='f')
SELECT * FROM cast
WHERE gender='f';


-- 两表字段不同,追加写入
INSERT INTO TABLE cast2(id, name)
PARTITION(gender='m')
SELECT id, name FROM cast
WHERE gender='m';

 如果要写入目标表的多个分区,或者写入不同的表(不一定是分区表),可以用以下的方式只扫描一次输入数据:

FROM cast 
INSERT OVERWRITE TABLE cast1   
PARTITION (gender='m')
SELECT * WHERE cast.gender='m'

INSERT OVERWRITE TABLE cast1   
PARTITION (gender='f')
SELECT * WHERE cast.gender='f'

INSERT INTO TABLE cast2(id, name)
SELECT ID, NAME 

2.2 动态分区写入

如果需要创建非常多的分区,可以用动态分区的方法来写入。注意:

  • select语句中是根据分区值位置而不是命名来匹配的
  • 静态分区和动态分区混用时,静态分区键必须在动态分区键之前
INSERT OVERWRITE TABLE employee
PARTITION(country,state)
SELECT ...,se.cty,se.st
FROM staged_employss se;


--静态和动态分区混合
INSERT OVERWRITE TABLE employee
PARTITION(country='US',state)
SELECT ...,se.cty,se.st
FROM staged_employss se
WHERE se.cty='US';

3、单个查询创建表并写入数据

常用于从一个宽表中选取部分需要的数据集。但不能用于外部表。

CREATE TABLE cast_m
AS
SELECT ID, NAME FROM cast
WHERE gender='m';

4、导出数据

如果数据文件是刚好需要的,可以直接拷贝出来。

# 在同个文件系统中
hdfs dfs -cp source_path target_path

# 拷贝到本地文件系统
hdfs dfs -copyToLocal source_path target_path

也可以用INSERT...OVERWRITE写出数据。

--路径是HDFS的/tmp路径下
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/cast'  
SELECT * FROM CAST;

多个分区跟加载数据也是一样的操作。local跟overwrite关键字跟前面一样。

FROM staged_employee se
INSERT OVERWRITE DIRECTORY '/tmp/oa_employee'
SELECT * WHERE se.sty='US' and se.st='OR'

INSERT OVERWRITE DIRECTORY '/tmp/ca_employee'
SELECT * WHERE se.sty='US' and se.st='CA'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值