【问题标题】:White spaces instead of NULL in Hive table after Sqoop importSqoop 导入后 Hive 表中的空格而不是 NULL
【发布时间】:2019-08-27 11:41:57
【问题描述】:

我创建了将数据从 MS SQL 导入 Hive 的 sqoop 进程,但我遇到了 'char' 类型字段的问题。 Sqoop 导入代码:

sqoop import \
    --create-hcatalog-table \
    --connect "connection_parameters" \
    --username USER \
    --driver net.sourceforge.jtds.jdbc.Driver \
    --null-string '' \
    --null-non-string '' \
    --class-name TABLE_X \
    --hcatalog-table TABLE_X_TEST \
    --hcatalog-database default \
    --hcatalog-storage-stanza "stored as orc tblproperties ('orc.compress'='SNAPPY')" \
    --map-column-hive "column_1=char(10),column_2=char(35)" \
    --num-mappers 1 \
    --query "select top 10 "column_1", "column_2" from TABLE_X where \$CONDITIONS" \
    --outdir "/tmp"

column_1 类型为 char(10) 如果没有数据,则应为 NULL。但是 Hive 用 10 个空格填充该字段。

column_2 类型为char(35) 也应该为 NULL,但有 35 个空格。

这是个大问题,因为我无法像这样运行查询:

select count(*) from TABLE_X_TEST where column_1 is NULL and column_2 is NULL;

但我必须使用这个:

select count(*) from TABLE_X_TEST where column_1 = '          ' and column_2 = '                                   ';

我尝试更改查询参数并使用修剪功能:

--query "select top 10 rtrim(ltrim("column_1")), rtrim(ltrim("column_2")) from TABLE_X where \$CONDITIONS"

但它不起作用,所以我认为这不是源的问题,而是 Hive 的问题。

如何防止 Hive 在空字段中插入空格?

【问题讨论】:

  • 你说使用 rtrim 和 ltrim 不起作用是什么意思?错误?仍然得到看起来像空白的东西?你确定里面没有隐藏字符吗?

标签: hadoop hive sqoop


【解决方案1】:

您需要更改这些参数:

--null-string '\\N' \
--null-non-string '\\N' \

默认情况下,Hive 期望 NULL 值将使用字符串常量 \N 进行编码。 Sqoop 默认使用字符串常量null 对其进行编码。要纠正不匹配,您需要使用 Hive 的使用参数 --null-string--null-non-string 覆盖 Sqoop 的默认行为(这是您所做的,但值不正确)。详情请见docs

【讨论】:

  • 感谢您的回答,但这些参数不是问题。我尝试使用 sign '\\N' 和许多其他方法,但并没有解决问题。
【解决方案2】:

我尝试使用 Sqoop hcatalog 创建 orc 表时不提供 null-string 和 null-non-string 选项,源中的所有 null 都反映为 NULL,我可以使用 is null 函数进行查询。

如果您找到任何其他处理 null 的解决方案,请告诉我。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2019-04-15
    • 1970-01-01
    • 2016-08-07
    • 2017-02-03
    • 1970-01-01
    • 2016-04-26
    • 2016-12-17
    • 2018-01-06
    相关资源
    最近更新 更多