hadoop - Sqoop 导入后 Hive 表中的空格而不是 NULL

标签 hadoop hive sqoop

我创建了将数据从 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/

相关文章:

hadoop - 如何在Impala命令行中传递多个SQL文件

eclipse - 使用运行对话框 (F11) 在 Eclipse 中的远程集群上启动 Hadoop Map Reduce 作业

hadoop - 如何squeop导入将新数据追加到分区配置单元表中,从而在同一分区列上创建新的分区文件夹?以下是我的情况

oracle - sqoop和oracle问题?

hadoop - map 减少概念

bash - 最近 24 小时从 HDFS 中的多个目录复制文件到本地

hadoop - 插入覆盖本地目录启动 map reduce 作业以进行简单查询

hadoop - 将数据从平面文件加载到配置单元表时获取空值

datetime - 在 Hive 中将字符串转换为时间戳

mysql - sqoop 导入查询给出重复名称错误