python - 在 Airflow 中使用 Sqoop 运算符在 HIVE 表中使用“//N”空字符串参数导致“/N”字符串值
问题描述
我正在尝试使用 sqoop 使用 Airflow Sqoop Operator 传输一些数据。此数据包含空值,我希望它们NULL
在我的 HIVE 表中结束。
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 会导致从 Airflow 日志中获取以下命令:
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
HIVE 表中的正确值。
我想问题在于 Sqoop 作业产生的 HIVE 查询的不同。从 Airflow 执行命令时的 HIVE 查询:
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\001' LINES TERMINATED BY '\\012' STORED AS TEXTFILE
直接从 Shell 执行命令时的 HIVE 查询:
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' LINES TERMINATED BY '\012' STORED AS TEXTFILE
请在一个场景上给我建议,改变我的 sqoop 运算符,以便在 Airflow 中生成的 HIVE 查询与直接使用 Shell 中的命令相同,从而NULL
在 HIVE 表中产生结果。仅删除一个反斜杠是行不通的。
有关 sqoop 运算符的更多信息,请点击此处。
解决方案
我找到了解决方案。通过:
'null-non-string' : r'\\N',
'null-string' : r'\\N'
最终在命令中传递参数--null-non-string \\N
并最终在 HIVE 中给出 NULL 结果。但是,直接在 shell 中传递这样的参数会引发非法转义字符错误......因此,在 shell 中处理命令的方式有所不同。
推荐阅读
- python - AttributeError:模块“熊猫”没有属性“ewma”
- gps - 运行 .adb 程序时“无法为文件 random.ads 生成代码”
- mongodb - MongoDB 将一个 $jsonSchema 链接到另一个 $jsonSchema
- progressive-web-apps - PWA。如何向用户提供安装应用程序的报价?
- node.js - 运行时应用程序
- javascript - 从 URL 预填充 HTML 表单文本
- python - 来自磁条索引的信用卡输入
- windows - 如何让 bazel 使用特定的 VC++ 工具集?
- jupyter-notebook - 使用 HTML 在 Jupyter notebook markdown 中并排放置两个图像是不可能的吗?
- r - 如果分钟是双倍的,为什么分钟的最小值是 0?