【发布时间】:2019-08-27 11:41:57
【问题描述】:
我创建了将数据从 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 = ' ';
我尝试更改查询参数并使用修剪功能:
--query "select top 10 rtrim(ltrim("column_1")), rtrim(ltrim("column_2")) from TABLE_X where \$CONDITIONS"
但它不起作用,所以我认为这不是源的问题,而是 Hive 的问题。
如何防止 Hive 在空字段中插入空格?
【问题讨论】:
-
你说使用 rtrim 和 ltrim 不起作用是什么意思?错误?仍然得到看起来像空白的东西?你确定里面没有隐藏字符吗?