Hive学习—数据操作

第5章 HiveQL:数据操作

第4章主要介绍如何创建表,随之而来的下个问题即,如何装载数据到这些表中。
本章主要讨论Hive查询语言中,向表中装载数据和从表中抽取数据到文件系统的数据操作语言部分。

5.1 向管理表中装载数据

既然H没有行级别的数据插入、数据更新和删除操作,那么往表中装载数据的唯一途径就是使用一种“大量”的数据装载操作。
LOAD DATA LOCAL…拷贝本地数据到位于分布式文件系统上的目标位置,而LOAD DATA…转移数据到目标位置。
因为文件是以这种方式移动的,Hive要求源文件和目标文件以及目录应该在同一个文件系统中。例如,用户不可以使用LOAD DATA 语句将数据从一个集群的HDFS中装载到另一个集群的HDFS中。
如果用户指定了OVERWRITE关键字,那么目标文件夹中之前存在的数据将会被删除掉。
如果目标表是分区表那么需要使用PARTITION子句,而且用户必须为每个分区的键指定一个值。
Hive并不会验证用户装载的数据和表的模式是否匹配。然而,Hive 会验证文件格式是否和表结构定义的一致。例如,如果表在创建时定义的存储格式是SEQUENCEFILE,那么转载进去的文件也应该是sequencefile格式才行。

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

INSERT 语句允许用户通过查询语句向目标表中插入数据。
依旧使用前章中表employees作为例子,这里假设另一张名为staged_employees的表已经有相关数据了,在staged_employees表中分别使用cnty和st表示国家和州。

INSERT OVERWRITE TABLE employees
PARTITION (country='US',state='OR')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR'

OVERWRITE :之前分区中的内容会被覆盖;
INTO :追加写入数据,而不会覆盖;
应用场景:数据已经存在于某个目录下,对 Hive 来说是一个外部表,而现在想将其导入到最终的分区表中。如果用户想把源表数据导入到一个具有不同记录格式的目标表,可以使用这种方法。
思考:如果staged_employees表非常大,而且用户需要对65个州都执行这些语句,那么意味这要需要扫描staged_employees表65次!Hive提供了另一种INSERT语法,可以只扫描一次输入数据,然后按多种方式进行划分。下例显示了如何为3个州创建表employees分区:

FROM staged_employees se
INSERT OVERWRITE TABLE employees
    PARTITION ( country = 'US' , state = 'OR')
    SELECT * WHERE se.cnty = 'US' AND se.st = 'OR')
INSERT OVERWRITE TABLE employees
    PARTITION ( country = 'US' , state = 'CA')
    SELECT * WHERE se.cnty = 'US' AND se.st = 'CA')
INSERT OVERWRITE TABLE employees
    PARTITION ( country = 'US' , state = 'IL')
    SELECT * WHERE se.cnty = 'US' AND se.st = 'IL')

从staged_employees表中读取的每条记录都会经过一条 SELECT…WHERE…子句进行判断。
通过这个结构,源表中的某些数据可以被写入到目标表的多个分区中或者不被写入任一分区中。
动态分区插入
问题:前面的语法,如果需要创建非常多的分区,那么用户需要写非常多的SQL!因此可以使用Hive提供的一个动态分区功能。

INSERT OVERWRITE TABLE employees
PARTITION (country , state)
SELECT ...,se.cnty,se.st
FROM staged_employees se

Hive 根据SELECT语句中最后2列来确定分区字段country和state的值。源表字段值和输出分区值之间的关系是根据位置而不是根据命名来匹配
假设表stage_employees中共有100个国家和州的话,执行完上面的这个查询后,表employees将会有100个分区!

用户也可以混合使用动态和静态分区。如下例中指定了country字段的值为静态的US,而分区字段state是动态值:

INSERT OVERWRITE TABLE employees
PARTITION (country = 'US',state)
SELECT ...,se.cnty,se.st
FROM staged_employees se
WHERE se.cnty = 'US'

静态分区键必须出现在动态分区键之前
动态分区属性

属性名称 缺省值 描述
hive.exec.dynamic.partition false 设置成true,表示开启动态分区功能
hive.exec.dynamic.partition.mode strict 设置成nonstrict,表示允许所有分区都是动态的
hive.exec.max.dynamic.partitions.pernode 100 每个mapper和reducer可以创建的最大动态分区个数。如果某个mapper或者reducer尝试创建大于这个值的分区的话会抛出一个致命错误信息
hive.exec.max.dynamic.partitions +1000 一个动态分区创建语句可以创建的最大动态分区个数。如果超过这个值会抛出一个致命错误信息
hive.exec.max.created.files 100000 全局可以创建的最大文件个数。有一个Hadoop计数器会跟踪记录创建了多少个文件,如果超过这个值会抛出一个致命错误信息

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

用户同样可以在一个语句中完成创建表并将查询结果载入这个表的操作:

CREATE TABLE ca_employees
AS SELECT name,salary,address
FROM employees
WHERE se.state = 'CA'

这个功能常见情况是从一个大的宽表中选取部分需要的数据集。

5.4 导出数据

猜你喜欢

转载自blog.csdn.net/weixin_43387060/article/details/86664172