Sqoop导入后,Hive表中的空格代替NULL

时间:2019-04-05 14:25:34

标签: hadoop hive sqoop

我创建了一个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_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在空白字段中插入空格?

2 个答案:

答案 0 :(得分:1)

您需要更改以下参数:

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

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

答案 1 :(得分:0)

我尝试不提供null字符串和null-non-string的选项来使用Sqoop hcatalog创建orc表,源中的所有null都反映为NULL,并且我能够使用null函数进行查询。

让我知道您是否找到其他方法来处理null。