我创建了将数据从 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 = ' ';
我尝试更改查询参数并使用 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
对其进行编码。要纠正不匹配,您需要使用 Hive 的参数 --null-string
和 --null-non-string
覆盖 Sqoop 的默认行为(这是您做但使用不正确的值)。有关详细信息,请参阅 docs .
关于hadoop - Sqoop 导入后 Hive 表中的空格而不是 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55537590/