teradata和hive之间的字符串匹配不一致

r55awzrz  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(439)

我正在进入Hive学习Hive。我在teradata中有customer表,使用sqoop在hive中提取完整的表,效果很好。
请参阅以下teradata和hive中的客户表。
在teradata中:

select TOP 4 id,name,'"'||status||'"' from customer;

    3172460     Customer#003172460  "BUILDING  "     
    3017726     Customer#003017726  "BUILDING  "
    2817987     Customer#002817987  "COMPLETE  "    
    2817984     Customer#002817984  "BUILDING  "

在Hive中:

select id,name,CONCAT ('"' , status , '"') from customer LIMIT 4;

    3172460     Customer#003172460  "BUILDING  "     
    3017726     Customer#003017726  "BUILDING  "
    2817987     Customer#002817987  "COMPLETE  "    
    2817984     Customer#002817984  "BUILDING  "

当我试图从表customer中获取记录时,它的列匹配是字符串类型。我在不同的环境中对同一个查询得到不同的结果。
请参见下面的查询结果。。
在teradata中:

select TOP 2 id,name,'"'||status||'"' from customer WHERE status = 'BUILDING';

    3172460     Customer#003172460  "BUILDING  "     
    3017726     Customer#003017726  "BUILDING  "

在Hive中:

select id,name,CONCAT ('"' , status , '"') from customer WHERE status = 'BUILDING' LIMIT 2;

  **<<No Result>>**

看来teradata在实际比较stating值之前做的事情还不够。但Hive是匹配字符串,因为它是。
不确定,这是预期的行为或错误,或可以提出作为增强。
我看到下面可能的解决方案:*转换成前后带有通配符的like运算符表达式
期待你对此的回应。如何在Hive中处理/实现。

1u4esq0p

1u4esq0p1#

你可以用 rtrim 功能,即:

select id,name,CONCAT ('"' , status , '"') from customer WHERE rtrim(status) = 'BUILDING' LIMIT 2;

但这里出现的问题是字符串比较Hive使用什么标准?根据ansi/iso sql-92“building”==“building”,这里有一个关于它的文章链接。

xe55xuns

xe55xuns2#

回答我自己的问题…从hive用户邮件列表中获取
hive是唯一符合sql标准的产品,
在hive中,字符串比较就像在java中一样工作
所以在 hive 里

"BUILDING" = "BUILDING"
    "BUILDING " != "BUILDING" (extra space added)

相关问题