在配置单元表中使用sqoop运算符,使用'//n'null字符串参数将导致'/n'字符串值

dfddblmv  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(354)

我正在尝试使用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操作符和钩子的信息。

tnkciper

tnkciper1#

我找到了解决办法。经过:

'null-non-string' : r'\\N',
        'null-string' : r'\\N'

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

相关问题