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