Import/Export

Version

Hive 0.8.0 中添加了EXPORTIMPORT命令(请参见HIVE-1918)。

在 Hive 1.2.0 中添加了对EXPORTIMPORT命令的复制扩展(请参见HIVE-7973配置单元复制开发)。

Overview

EXPORT命令将表或分区的数据以及元数据导出到指定的输出位置。然后可以将此输出位置移至另一个 Hadoop 或 Hive 实例,并使用IMPORT命令从该位置导入。

导出分区表时,原始数据可能位于不同的 HDFS 位置。还支持导出/导入分区子集的功能。

导出的元数据存储在目标目录中,数据文件存储在子目录中。

EXPORTIMPORT命令独立于所使用的源和目标元存储 DBMS 起作用;例如,它们可以在 Derby 和 MySQL 数据库之间使用。

IMPORT将创建目标表/分区(如果不存在)。所有表的属性/参数都将与在EXPORT中用于生成存档的表的属性/参数相同。如果目标存在,则检查它是否具有适当的架构,Input/OutputFormat 等。如果目标表存在且未分区,则它必须为空。如果目标表存在并已分区,则表中不得存在要导入的分区。

Export Syntax

EXPORT TABLE tablename [PARTITION (part_column="value"[, ...])] 
  TO 'export_target_path' [ FOR replication('eventid') ]

Import Syntax

IMPORT [[EXTERNAL] TABLE new_or_original_tablename [PARTITION (part_column="value"[, ...])]] 
  FROM 'source_path' 
  [LOCATION 'import_target_path']

Replication usage

当在复制上下文中使用EXPORTIMPORT命令时,它们的行为略有不同,旨在供在配置单元仓库之间执行复制的工具使用。在大多数情况下,最终用户将不需要使用此附加标签,除非对复制目标仓库进行手动引导,以便增量复制工具可以接管该点。

它们利用表或分区中的特殊表属性“ repl.last.id”(取决于要复制的对象)来确保复制导出/导入仅在更新比更新时才更新对象。它影响的对象。在导出端,它用一个在源仓库上单调递增的 id 标记复制导出转储(每次修改源仓库 metastore 时递增)。另外,标记为复制的导出如果尝试导出当前不存在的对象,则不会导致错误。 (这是因为在一般的复制流程中,很有可能在事件被外部工具作用以进行复制时,有可能该对象已被删除,因此不应停止复制管道.)

在导入方面,没有语法更改,但是导入是在使用 FOR REPLICATION 标记生成的导出转储上运行的,它将检查要复制到的对象是否存在。如果该对象已经存在,它将检查该对象的 repl.last.id 属性,以确定所导入的内容是否比目标仓库中该对象的当前状态新。如果更新是较新的,则它将用较新的信息替换对象。如果更新早于已存在的对象,则更新将被忽略,并且不会导致任何错误。

对于首次使用 EXPORT 进行手动引导的用例,建议用户使用“ FOR 复制('bootstrapping')”标记。 (高级用户注意:这里的“ bootstrapping”选择是任意的,也可能是“ foo”.true 的目标是拥有一个值,使得所有进一步的增量复制 id 都将大于此原始 id.因此,此初始 ID 的整数值应为 0,因此,任何不包含数字的字符串都是可以接受的,但是将初始标签设为“ 123456”会很不好,因为它可能导致进一步的更新, repl.last.id <123456 将不适用.)

Examples

简单的导出和导入:

export table department to 'hdfs_exports_location/department';
import from 'hdfs_exports_location/department';

在导入时重命名表:

export table department to 'hdfs_exports_location/department';
import table imported_dept from 'hdfs_exports_location/department';

导出分区和导入:

export table employee partition (emp_country="in", emp_state="ka") to 'hdfs_exports_location/employee';
import from 'hdfs_exports_location/employee';

导出表和导入分区:

export table employee to 'hdfs_exports_location/employee';
import table employee partition (emp_country="us", emp_state="tn") from 'hdfs_exports_location/employee';

指定导入位置:

export table department to 'hdfs_exports_location/department';
import table department from 'hdfs_exports_location/department' 
       location 'import_target_location/department';

导入为外部表:

export table department to 'hdfs_exports_location/department';
import external table department from 'hdfs_exports_location/department';