我正在尝试使用Airflow sqoop运算符使用Sqoop来传输一些数据。此数据包含空值,我希望它们在我的配置单元表中以NULL
的形式结束。
sqoop_operator_task = SqoopOperator(
task_id = table[0],
conn_id = "JDBC_OPA",
table = table_name,
cmd_type = "import",
target_dir = "/sourcedata/sqoop_tmp/"+table_name,
num_mappers = 1,
extra_import_options = {
'delete-target-dir' : "",
'fields-terminated-by' : r'"\001"',
'hive-database' : database_name,
'hive-table' : table[0],
'hive-delims-replacement' : "' '",
'hive-import' : "",
'hive-overwrite' : "",
'null-non-string' : r"'\\N'",
'null-string' : r"'\\N'"
},
dag = dag
)
对null-non-string和null-string使用r"'\\N'"
会导致从气流日志中获取以下命令:
sqoop import --username SELECT_OPA_DSC --password MASKED --num-mappers 1 --connect MASKED --target-dir /sourcedata/sqoop_tmp/OWNER_DMK.DMK_AVY --as-textfile --delete-target-dir --fields-terminated-by "\001" --hive-database test_db --hive-table DMK_AVY --hive-delims-replacement ' ' --hive-import --hive-overwrite --null-non-string '\\N' --null-string '\\N' --table OWNER_DMK.DMK_AVY
这是根据Sqoop documentation如何格式化它以NULL
结尾的。然而,我在我的表中以'\N‘结束。但是,在shell中直接执行完整的命令确实会在配置单元表中给出正确的NULL
值。
我猜问题在于Sqoop作业生成的HIVE查询的不同之处。从Airflow执行命令时的配置单元查询:
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\001' LINES TERMINATED BY '\\012' STORED AS TEXTFILE
直接从Shell执行命令时的配置单元查询:
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' LINES TERMINATED BY '\012' STORED AS TEXTFILE
请建议我一个场景,修改我的sqoop操作符,以便在Airflow中生成的HIVE查询与直接使用Shell中的命令相同,从而在HIVE表中生成NULL
结果。仅仅删除一个反斜杠是行不通的。
更多关于sqoop运算符和钩子here的信息。
发布于 2020-10-13 18:06:33
我找到了一个解决方案。传球:
'null-non-string' : r'\\N',
'null-string' : r'\\N'
最终,参数作为--null-non-string \\N
在命令中传递,并最终在配置单元中产生NULL结果。然而,像这样直接在shell中传递参数会引发非法的转义字符错误...因此,在shell中处理命令的方式有所不同。
https://stackoverflow.com/questions/64322421
复制相似问题