整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

15.9.2 导出和 SequenceFile

之前的导出示例是从一个Hive表中读取源数据,该Hive表以分隔文本文 件形式保存在HDFS中。Sqoop也可以从非Hive表的分隔文本文件中导出 数据。例如,Sqoop可以导出MapReduce作业结果的文本文件。

Sqoop还可以将存储在SequenceFile中的记录导出到输出表,不过有一些限 制。SequenceFile中可以保存任意类型的记录,但由于Sqoop的导出工具从 SequenceFile中读取对象后直接发送到OutputCollector,由它将这些对 象传递给数据库导出OutputFormat,因此为了能让Sqoop使用,记录 必须被保存在SequenceFile键/值对格式的“值”部分,并且必须继承抽象 类 com.cloudera.sqoop.lib.SqoopRecord(像 Sqoop 生成的所有类 那样)。 .

如果基于导出目标表,使用codegen工具(sqoop-codegen)为记录生成一个 SqoopRecord的实现,那你就可以写一个MapReduce程序,填充这个类的 实例并将它们写入SequenceFile,接着sqoop-export就可以将这咋 SequenceFile文件导出到表中。还有另外一种方法,即将数据放入 SqoopRecord实例中,然后保存到SequenceFile中。如果数据是从数据库 表导入HDFS的,那么在经过某种形式的修改后,可以将结果保存在持有 相同数据类型记录的SequenceFile中。 在这种情况下,Sqoop应当利用现有的类定义从SequenceFile中读取数据,


而不是像导出文本记录时所做的那样,为执行导出生成一个新的(临时的)记 录容器类。通过为Sqoop提供–classname和–jarfile参数,可以禁 止它生成代码,而使用现有的记录类和jar包。在导出记录时,Sqoop将使 用指定jar包中指定的类。

在下面的例子中,我们将重新导入widgets表到SequenceFile中,然后再

将其导出到另外一个数据库表:

% sqoop import --connect jdbc:mysql://localhost/hadoopguide \
>  --table widgets -ml --class-name WidgetHolder "as-sequencefile \
>  --target-dir widget_sequence_files --bindir .
10/07/05 17:09:13 INFO mapreduce.ImportJobBase: Retrieved 3 records.
% mysql hadoopguide
mysql> CREATE TABLE widgets2(id INT, widget_name VARCHAR(100),
-> price DOUBLE, designed DATE, version INT> notes VARCHAR(200));
Query OK, 0 rows affected (0.03 sec) mysql> exit;
% sqoop export --connect jdbc:mysql://localhost/hadoopguide \
>  --table widgets2 -m 1 --class-name WidgetHolder \
>  --jar-file widgets.jar --export-dir widget_sequence_files
10/07/05 17:26:44 INFO mapreduce.ExportJobBase: Exported 3 records.

在导入过程中,我们指定使用SequenceFile格式,并且将JAR文件放入当 前目录(使用bindir),这样将来便可以重用它,否则它将会被保存在一 个临时目录中。然后我们创建一个用于导出的目标表,该表在模式上稍有 不同但与源数据兼容;在接下来的导出操作中,我们使用现有的生成代码 从SequenceFile中读取记录并将它们写入数据库。


转载请注明:全栈大数据 » 15.9.2 导出和 SequenceFile

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址