代码之家  ›  专栏  ›  技术社区  ›  Mrgr8m4

sqoop导入后配置单元表中的空格而不是空

  •  0
  • Mrgr8m4  · 技术社区  · 6 年前

    我创建了将数据从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) 如果没有数据,则应为空。但是蜂巢用10个空格填满了整个区域。

    column_2 哪种类型 char(35) 也应该为空,但有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在空字段中插入空格?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Iskuskov Alexander    6 年前

    您需要更改以下参数:

    --null-string '\\N' \
    --null-non-string '\\N' \
    

    默认情况下,hive期望 NULL 值将使用字符串常量进行编码 \N 是的。默认情况下,sqoop使用字符串常量对其进行编码 null .要纠正不匹配,需要使用hive的using参数覆盖sqoop的默认行为 --null-string --null-non-string (这是您所做的,但值不正确)。有关详细信息,请参见 docs 是的。

        2
  •  0
  •   prashanth    6 年前

    我尝试了使用sqoop hcatalog创建orc表,但没有提供空字符串和空非字符串选项,源中的所有空值都反映为空,我可以使用is null函数进行查询。

    如果你发现了处理空值的其他方法,请告诉我。