我创建了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 = ' ';
我尝试更改查询参数并使用trim函数:
--query "select top 10 rtrim(ltrim("column_1")), rtrim(ltrim("column_2")) from TABLE_X where \$CONDITIONS"
但它不起作用,所以我认为这不是源的问题,而是Hive。
如何防止Hive在空字段中插入空格?
您需要更改这些参数:
--null-string '\\N' \
--null-non-string '\\N' \
默认情况下,Hive期望使用字符串常量NULL
对\N
值进行编码。默认情况下,Sqoop使用字符串常量null
对其进行编码。为了纠正不匹配,你需要使用参数--null-string
和--null-non-string
来覆盖Sqoop的默认行为(这是你做的,但是值不正确)。有关详细信息,请参阅docs。
我试过没有给出使用Sqoop hcatalog创建orc表的null-string和null-non-string选项,source中的所有空值都反映为NULL并且我能够使用is null函数进行查询。
如果您找到任何其他解决方案来处理null,请告诉我。