首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Airflow中使用Sqoop运算符时,使用'//N‘空字符串参数会在配置单元表中生成'/N’字符串值

在Airflow中使用Sqoop运算符时,使用'//N‘空字符串参数会在配置单元表中生成'/N’字符串值
EN

Stack Overflow用户
提问于 2020-10-13 01:17:50
回答 1查看 266关注 0票数 2

我正在尝试使用Airflow sqoop运算符使用Sqoop来传输一些数据。此数据包含空值,我希望它们在我的配置单元表中以NULL的形式结束。

代码语言:javascript
运行
复制
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'"会导致从气流日志中获取以下命令:

代码语言:javascript
运行
复制
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执行命令时的配置单元查询:

代码语言:javascript
运行
复制
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\001' LINES TERMINATED BY '\\012' STORED AS TEXTFILE

直接从Shell执行命令时的配置单元查询:

代码语言:javascript
运行
复制
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' LINES TERMINATED BY '\012' STORED AS TEXTFILE

请建议我一个场景,修改我的sqoop操作符,以便在Airflow中生成的HIVE查询与直接使用Shell中的命令相同,从而在HIVE表中生成NULL结果。仅仅删除一个反斜杠是行不通的。

更多关于sqoop运算符和钩子here的信息。

EN

Stack Overflow用户

回答已采纳

发布于 2020-10-13 18:06:33

我找到了一个解决方案。传球:

代码语言:javascript
运行
复制
        'null-non-string' : r'\\N',
        'null-string' : r'\\N'

最终,参数作为--null-non-string \\N在命令中传递,并最终在配置单元中产生NULL结果。然而,像这样直接在shell中传递参数会引发非法的转义字符错误...因此,在shell中处理命令的方式有所不同。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64322421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档