Hive学习笔记(五)向表中装载数据

1.向管理表中装载数据
再次强调,Hive没有行级别的数据插入、数据更新和删除操作。

LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'
OVERWRITE INTO TABLE employees
PARTITION (country = 'US', state = 'CA');
  • 如果分区目录不存在的话,这个命令会先创建分区目录,然后再将数据拷贝到该目录下。
  • 如果目标是非分区表,那么语句中应该省略PARTITION子句。
  • 如果使用了LOCAL这个关键字,那么这个路径应该为本地文件系统路径。数据将会被拷贝到目标位置。如果省略掉LOCAL关键字,那么这个路径应该为分布式文件系统路径。也就是说,LOAD DATA LOCAL…拷贝本地数据到位于分布式文件系统上的目标位置,而LOAD DATA…转移数据到目标位置。
  • 如果用户指定了OVERWRITE关键字,那么目标文件夹中的之前存在的数据将会被先删除掉。如果没有这个关键字,仅仅会把新增的文件追加到目标文件夹中而不会删除之前的数据。然而,如果使用OVERWRITE关键字并且目标文件夹中已经存在和装载的文件同名的文件,那么旧的同名文件将会被覆盖重写。如果没有使用OVERWRITE关键字并且目标文件夹中已经存在和装载的文件同名的文件,那么会保留之前的文件并且会重命名新文件为“之前的文件名_序列号”。
  • INPATH子句要求这个路径下不可以包含任何文件夹。

2.通过查询语句向表中插入数据
INSERT语句允许用户通过查询语句向目标表中插入数据。
假设有一个叫staged_employees的表有相关数据了,在表staged_employees中我们使用不同的名字来表示国家和州,分别称作cnty和st。

INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'CA')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'CA';
  • 这里使用了OVERWRITE关键字,因此之前分区的内容(如果是非分区表,就是之前表中的内容)将会被覆盖掉。
  • 如果这里没有使用OVERWRITE关键字或者使用INTO关键字替换它的话,那么Hive将会以追加的方式写入文件。

如果表staged_employees非常大,需要向65个州都执行这些语句,那么也就意味着要扫描表staged_employees65次。Hive提供了另一种INSERT语法,可以只扫描一次输入数据,然后按多种方式进行划分。

FROM staged_employees se
INSERT OVERWRITE TABLE employees
    PARTITION (country = 'US', state = 'OR')
    SELECT * WHERE se.cnty = 'US' AND se.state = 'OR'
INSERT OVERWRITE TABLE employees
    PARTITION (country = 'US', state = 'CA')
    SELECT * WHERE se.cnty = 'US' AND se.state = 'CA'
INSERT OVERWRITE TABLE employees
    PARTITION (country = 'US', state = 'IL')
    SELECT * WHERE se.cnty = 'US' AND se.state = 'IL';
  • 每个INSERT子句,只要有需要,都可以插入到不同的表中,而那些目标表可以是分区表也可以是非分区表。因此,输入的某些数据可能输出到多个输出位置而其他一些数据可能就被删除掉了!
  • 当然,这里可以混合使用INSERT OVERWRITE句式和INSERT INTO句式。
    3.动态分区插入(一条语句就可以向N个分区装载数据,很好用)
    动态分区的部分属性:
    Hive学习笔记(五)向表中装载数据_第1张图片
    Hive提供了一个动态分区功能,其可以基于查询参数推断出需要创建的分区名称:
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nostrict;
SET hive.exec.max.dynamic.partitions.pernode = 1000;
INSERT OVERWRITE TABLE employees
PARTITION (country,state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;
  • Hive根据SELECT语句中最后2列来确定分区字段country和state的值。
  • 在表staged_employees中我们使用了不同的命名,就是为了强调源表字段值和输出分区值之间的关系是根据位置而不是根据命名来匹配的。
    4.单个查询语句中创建表并加载数据
CREATE TABLE ca_employees
AS SELECT name, salary, address
FROM employees se
WHERE se.state = 'CA';

注意:这个功能不能用于外部表。
5.导出数据

  • 如果数据文件恰好是用户需要的格式,那么只需要简单地拷贝文件夹或文件:
hadoop fs -cp source_path target_path
  • 否则用户可以使用INSERT…DIRECTORY…
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees se
WHERE se.state = 'CA';

你可能感兴趣的:(Hive,数据分析)