4.1sqoop从两张表中导入数据

Apache Sqoop Cookbook 英文版-翻译学习!!
更多信息https://blue-shadow.top/
前几章介绍了在源数据库系统上有一个输入表的用例, 您需要将表作为一个整体或一个部分传输到 Hadoop 系统中。另一方面, 本章将重点介绍更高级的用例,
其中需要从多个表中导入数据, 或者需要通过调用各种数据库函数来自定义传输的数据,对于本章我们稍微改变了测试表cities。

4.1从两张表中导入数据

问题

您需要导入一个主表;但是, 此表已规范化。需要导入的值存储在一个字典表中, 主表仅包含指向字典中的值,而不是作为原始cities表中的自然键的外键。
您希望在运行Sqoop之前解决处理这些值, 并导入实际值, 而不是使用counties表的数值键。

解决方案

使用free-form query导入来替换表导入, Sqoop 将允许您指定任何查询来导入数据。使用 --query 参数来代替 --table 参数, 以获取你想传输的数据。
一个规范化表normcities和countries字典表,为了实现与导入非规范化表cities相同的输出, 您可以使用以下 Sqoop 命令:

sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--query 'SELECT normcities.id, \
countries.country, \
normcities.city \
FROM normcities \
JOIN countries USING(country_id) \
WHERE $CONDITIONS' \
--split-by id \
--target-dir cities

讨论

free-form查询导入是 Sqoop 的高级功能之一。与所有软件高级功能一样, 它赋予了软件强大的功能,也就伴随着重大责任。
在使用free-form查询导入时, 有很多事情需要注意。通过使用查询导入, Sqoop 无法使用数据库通过系统目录获取元数据。这也是个使用表导入的原因可能比等效的自由格式查询快原因。此外, 您还必须手动指定一些附加那些会被自动填充的参数。除了使用 --query参数外, 还需要指定参数 --split-by到那些会执行并行任务的列上,这个参数模式是绑定到主表中的主键上。第三个需要的参数是 --target-dir,用来指定需要在HDFS导入数据的路径。

Sqoop通过继承Hadoop的并行性执行进行高效数据传输。为了帮助Sqoop将查询拆分为多个可以并行传输的块,需要在查询的where子句中包括 CONDITIONS 占位符。 Sqoop将自动将这些占位符替换成成需要进行每个独立数据传输任务运行时的需要条件。也可以跳过使用CONDITIONS,强制要求sqoop只使用一个作业,通过参数
--num-mappers 1 参数,但是这个设置将会对性能造成影响。Sqoop会为查询在执行多个服务实例,用于不同的数据分片。这个参数对于一个简单的连接, 这不会
是一个问题, 但复杂的查询建将会是问题。

你可能感兴趣的:(4.1sqoop从两张表中导入数据)