Sqoop导入后,Hive表中的空格而不是NULL

问题描述 投票:0回答:2

我创建了sqoop进程,它将数据从MS SQL导入Hive,但是我遇到了'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_2char(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 = '                                   ';

我尝试更改查询参数并使用trim函数:

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

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

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

hadoop hive sqoop
2个回答
1
投票

您需要更改这些参数:

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

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


0
投票

我试过没有给出使用Sqoop hcatalog创建orc表的null-string和null-non-string选项,source中的所有空值都反映为NULL并且我能够使用is null函数进行查询。

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

© www.soinside.com 2019 - 2024. All rights reserved.