整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

12.6.4 导入数据

hadoop 小红牛 102℃ 0评论

我们已经见过如何使用LOAD
DATA操作,通过把文件复制或移到表的目录 中,从而把数据导入Hive的表(或分区)。也可以用INSERT语句把数据从
一个Hive表填充到另一个;或在新建表的时候使用C7XS结构,CTAS是 CREATE TABLE……AS SELECT 的缩写。

如果想把数据从一个关系数据库直接导入Hive,可以看一下Sqoop。详情 参见15.6_1节。

1. INSERT 语句

下面是INSERT语句的一个示例:

INSERT OVERWRITE TABLE target 
SELECT  coll, co12
 FROM source;

对于分区的表,可以使用PARTITION子句来指明数据要插入哪个分区:

INSERT OVERWRITE TABLE target 
PARTITION (dt=,2001-01-01J)
SELECT coll, co12 
FROM source;

OVERWRITE关键字在这两种情况下都是强制的。这意味着目标表(对于前面
的第一个例子)或2001-01-01分区(对于第二个例子)中的内容会被 SELECT语句的结果替换掉。如果你要向已经填充了内容的非分区表或分
区添加记录,那么可以使用INSERT INTO TABLE。

你可以在SELECT语句中通过使用分区值来动态指明分区:

INSERT OVERWRITE TABLE target
 PARTITION (dt)
SELECT coll, col2, dt 
FROM source;

这种方法称为“动态分区插入”(dynamic-partition insert)。这一特性默认是 关闭的,所以在使用前需要先把hive.exec.dynamic.partition设为True。

和其他数据库不同,Hive(现在)不支持在INSERT语句中直接以文字 形式给出一组记录的形式。也就是说,Hive不允许INSERT INTO…VALUES…形式的语句。

2.多表插入

在HiveQL中,可以把INSERT语句倒过来,把FROM子句放在最前面, 査询的效果是一样的:

FROM source
INSERT OVERWRITE TABLE target 
SELECT coll, col2;

可以在同一个查询中使用多个INSERT子句。•此时,这样的语法会让査询 的含义更清楚。这种“多表插入”(multitable insert)方法比使用多个单独的 INSERT语句效率更高,因为只需要扫描一遍源表就可以生成多个不相交的 输出。

下面的例子根据气象数据集来计算多种不同的统计数据:

FROM records2
INSERT OVERWRITE TABLE stations__by_year 
SELECT year, 
COUNT(DISTINCT station)
GROUP BY year
INSERT OVERWRITE TABLE records_by_year 
SELECT year, COUNT(l)
GROUP BY year
INSERT OVERWRITE TABLE good_records_by_year 
SELECT year, COUNT(l)
WHERE temperature != 9999
AND (quality = 0 OR quality = 1 OR quality = 4 OR quality = 5 OR quality = 9)
GROUP BY year;

这里只有一个源表(records2),但有三个表用于存放针对这个源表的三个 不同査询所产生的结果。

3.CREATE TABLE…AS SELECT 语句

把Hive査询的输出结果存放到一个新的表往往非常方便,这可能是因为输 出结果太多,不适宜于显示在控制台上或基于输出结果还有其他后续处理。

新表的列的定义是从SELECT子句所检索的列导出的。在下面的査询中, target表有两列,分别名为coll和col2,它们的数据类型和源表中对应 的列相同:

CREATE TABLE target
 AS
SELECT coll, col2 
FROM source;

CTAS操作是原子的,因此如果SELECT査询由于某种原因失败,新表就不 会被创建。

转载请注明:全栈大数据 » 12.6.4 导入数据

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址