Hadoop教程

导入大对象

在Sqoop中,“导入”(import)是指将数据从数据库系统移动到HDFS。与之相 反,“导出”(export)是将HDFS作为数据源,而将一个远程数据库作为目标。在 前面的几个小节中,我们导入了一些数据并且使用Hive对数据进行了分析。我们 可以将分析的结果导出到一个数据库中,供其他工具使用。

将一张表从HDFS导出到数据库时,我们必须在数据库中创建一张用于接收数据 的目标表。虽然Sqoop可以推断出哪个Java类型适合存储SQL数据类型,但反过 来却是行不通的(例如,有几种SQL列的定义都可以用来存储Java的String类 型,如CHAR(64)、VARCHAR(200)或其他一些类似定义)。因此,必须由用户来确 定哪些类型是最合适的。

我们打算从Hive中导出zip_profits表。首先需要在MySQL中创建一个具有相 同列顺序及合适SQL类型的目标表:

% mysql hadoopguidemysql> CREATE TABLE sales_by_zip (volume DECIMAL(8,2), zip INTEGER);Query OK, 0 nows affected (0.01 sec)

接着我们运行导出命令:

% sqoop export --connect jdbc:mysql://localhost/hadoopguide -m 1 \>--table sales_by_zip --export-dir /user/hive/warehouse/zip_profits \>--input-fields-terminated-by '\0001'10/07/02 16:16:50 INFO mapneduce.ExpontDobBase: Transferred 41 bytes in 10.8947 seconds (3.7633 bytes/sec)10/07/02 16:16:50 INFO mapneducG.Expont3obBase: Exported 3 records.

最后,我们可以通过检查MySQL来确认导出成功:

% mysql hadoopguide -e 'SELECT * FROM sales_by_zip'

+-------+-------+丨volume丨 zip  丨 +-------+-------+丨28.00 丨10005 丨丨403.71丨90210 丨丨20.00 丨95014 丨+-------+-------+

在Hive中创建zip_profits表时,我们没有指定任何分隔符。因此Hive使用了 自己的默认分隔符:字段之间使用Ctrl-A字符(Unicode编码0×0001)分隔,每条 记录末尾使用一个换行符分隔。当我们使用Hive来访问这张表的内容时(SELECT语句),Hive将数据转换为制表符分隔的形式,用于在控制台上显示。但是直接从 文件中读取这张表时,我们要将所使用的分隔符告知Sqoop。Sqoop默认记录是以 换行符作为分隔符,但还需要将字段分隔符Ctrl-A告之Sqoop。可以在sqoop export命令中使用--Input-fields-terminated-by参数来指定字段分隔符。 sqoop在指定分隔符时支持几种转义序列(以字符’\’开始)。在前面的导出例子中, 所用的转义序列被包围在'单引号’中,以确保shell会按字面意义处理它。如果不使 用引号,前导的反斜杠就需要转义处理(例如,--input-fields-terminated-by \\0001)。表15-1列出了 890叩所支持的转义序列。

表15-1.转义序列可以用于指定非打印字符作为Sqoop中字段和记录的分隔符

转义序列  描述\b	    退格\n	    换行	\r	    回车\t	    制表符\'	    单引号\"      双引号\\	    反斜杠\0	    NUL。

关注微信获取最新动态