在执行从关系数据库到 HDFS 的 Sqoop 导入时,我在 Hadoop 中使用 Sqoop 1 来集成自定义预处理代码。基本上,我使用该codegen
命令创建对象关系映射类,然后修改该类源代码以嵌入我的自定义预处理代码。readFields()
通过这种方法,在从 JDBC 结果集中读取字段时以及在对象实例中设置字段之前 ,我能够修改处理字段值的方法(在本例中,通过加密敏感字段)。
然后我在执行 Sqoop 导入操作时使用了这个修改过的 ORM 类文件。最终结果是,我的数据中的某些字段在写入 HDFS 之前由我的自定义代码加密。
例如,修改过的 ORM 类:
public class Customer extends SqoopRecord implements DBWritable, Writable {
...
public void readFields(ResultSet __dbResults) throws SQLException {
this.__cur_result_set = __dbResults;
this.id = JdbcWritableBridge.readInteger(1, __dbResults);
this.last_name = JdbcWritableBridge.readString(2, __dbResults);
this.first_name = JdbcWritableBridge.readString(3, __dbResults);
# encrypt cc (credit card) field, before setting value in object
this.cc = encrypt(JdbcWritableBridge.readString(4, __dbResults));
}
...
}
这种方法在 Sqoop 1 中运行良好。
但是我没有看到任何方法可以在 Sqoop 2 中集成这样的自定义预处理代码。Sqoop2 中没有codegen
选项。是否有可用于 Sqoop 2 的 UDF 或其他自定义连接器方法,在 Sqoop 导入作业期间处理字段?如果是这样,您能否指出一些示例或文档来说明它在 Sqoop 2 中的工作原理?