我正在尝试使用sqoop来使用sqoop操作符传输一些数据。此数据包含空值,我希望它们以 NULL
在我的 hive table上。
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
)
使用 r"'\\N'"
对于null non string&null string,将从气流日志中获取以下命令:
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文档应该如何格式化它以 NULL
. 但是,我的表中有'\n'。但是,直接在shell中执行完整的命令确实会给出正确的 NULL
配置单元表中的值。
我想问题在于sqoop作业生成的配置单元查询的不同。从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操作符,使aifflow中生成的配置单元查询与直接使用shell命令生成的查询相同 NULL
配置单元表中的结果。仅仅删除一个反斜杠是行不通的。
更多关于sqoop操作符和钩子的信息。
1条答案
按热度按时间tnkciper1#
我找到了解决办法。经过:
最后参数作为
--null-non-string \\N
并最终在配置单元中给出空结果。但是,在shell中直接传递这样的参数会引发非法的转义字符错误。。。因此,在shell中处理命令的方式有所不同。