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
将查询结果写入到这个表中