《Hive》编程指南第五章

HiveQL:数据操作

5.1 向管理表中装载数据

Hive没有行级别的数据插入更新,删除操作,向表中装载数据的唯一途径就是使用一种大量的数据装载操作
在这里插入图片描述
如果分区表目录不存在,会先创建分区目录,然后将数据从本地上传到hdfs对应的文件夹下。
partition是指定分区的意思,如果表为非分区表,则无需指定。

load data local拷贝本地数据到位于分布式问价那系统的目标位置。
load data将数据从hdfs某个文件目录下,转移到目标文件目录下。

overwrite指定了此关键字,目标文件夹中之前存在的数据将会被删除,然后在将文件拷贝到该文件夹下,如果没有指定该关键字则不会删除,相当于数据添加。如果没有使用overwrite,而目标文件夹下已经存在了同名的文件时,会保留之前文件并且会重命名新文件为“之前的文件名_序列号”

在导入数据时,如果表是分区表,则需要为每一个分区字段指定一个值

之前的hql会将数据放在这个目录下:
在这里插入图片描述
对于inpath指定的路径,还有一个限制,这个路径下不能包含任何文件夹。

hive不会验证用户装载数据和表的模式是否匹配(之前讲的读时检查),然而hive会验证文件格式是否和表的结构一致,例如,如果表在创建时定义的存储格式是SEQUENCEFILE,那么装载进去的文件也必须是这个格式才可以。

也就是说会对文件格式进行检查,而不会对文件的内容进行检查。

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

insert语句允许通过查询语句向目标表中插入数据,使用into相当于追加数据,使用overwrite相当于覆盖数据。

如果用户对一个表的很多个分区进行数据的插入,这时就需要对源数据表进行多次的扫描,为了避免对源数据表的多次扫描,hive提供了以下解决方法

在这里插入图片描述
在此处可以混合使用overwrite与into

动态分区插入

如果要创建非常多的分区,那么用户就需要写很多的sql。针对这种情况hive提供了动态分区的功能。其可以基于查询参数推断出需要创建的分区的分区名称。

格式如下:
在这里插入图片描述
上述语句,hive根据select语句中最后两列来确字段country与state的值。强调源字段值和输出分区值之间的关系是根据位置而不是根据命名来匹配的。

混合使用动态静态分区

在这里插入图片描述
静态分区必须指定在动态分区之前。
动态分区默认情况下没有开启,开启后默认是以严格模式执行的,在这种模式要求至少有一列分区字段是静态的,这有助于阻止因设计错误导致查询产生大量的分区。

在这里插入图片描述

例子:
在这里插入图片描述

单个查询语句中创建表并加载数据

在这里插入图片描述
这个功能常见情况是从一个大的宽表中选取部分需要的数据集,这个功能不能作用于外部表,可以使用alter table为外部表“引用到一个分区”,将元数据指定一个指向数据的路径。

5.4 导出数据

如何从表中导出数据呢?
如果表的文件格式是所需格式,那么直接导出即可。

hdfs dfs -cp source_path target_path

我们可以使用insert directory
在这里插入图片描述
关键字overwrite和local和之前是一样的。
路径可以写成全URL地址:例如hdfs://master-server/tmp/ca_employee

文件名为000000_0,如果有多个reducer来输出的话,我们还可以看到其他相似命名的文件。导出的文件看上去是没有分隔符的,因为^A ^B没有显示出来。
用户也可以使用如下方式制定多个输出文件夹

在这里插入图片描述
定制输出需要写一个定制的OUTPUTFORMAT。

有一种方法,可以建立一个自己要求的输出格式的表,比如特定的分隔符等,然后使用insert overwrite directory将查询结果写入到这个表中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值