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只使用一个作业,通过参数
--num-mappers 1 参数,但是这个设置将会对性能造成影响。Sqoop会为查询在执行多个服务实例,用于不同的数据分片。这个参数对于一个简单的连接, 这不会
是一个问题, 但复杂的查询建将会是问题。