首页 > 解决方案 > 从 String 到 Bigint 或其他方式 - 更喜欢什么?

问题描述

语境

我必须加入的两个表具有用于加入不同基础数据类型的同一列:

| --------- Table A -----------| | --------- Table B -----------| 
| Col_A (String) | Col_B | ... | | Col_A (Bigint) | Col_B | ... | 
|------------------------------| |------------------------------| 
| 1233456        | ...   | ... | | 1233456        | ...   | ... | 
|------------------------------| |------------------------------| 

当然,如果两个表都已经Bigint作为数据类型,它会更有效,但它就是这样。因此,我必须在连接期间强制转换其中一列。

由于答案可能非常依赖于使用的数据库等:我正在使用parquet-table 创建和查询Impalaor Hive。因此,对于表统计信息,使用 Hive 的 Metastore。


问题

如果我想要计算成本较低的联接,我应该投哪一列?
换句话说:将 a转换为 a或相反的计算成本更高吗?StringBigint

不幸的是,在我的集群中,我无法以可靠的方式测试时序。此外,我无法通过查看文档来回答这个问题。

-- The two join-options

-- Option 1: From String to Bigint
SELECT A.*
FROM A as A
INNER JOIN B as B on cast(A.Col_A as Bigint) = B.Col_A

-- Option 2: From String to Bigint
SELECT A.*
FROM A as A
INNER JOIN B as B on A.Col_A = cast(B.Col_A as String)

标签: sqlcastingparquet

解决方案


这两种方法之间存在差异,这可能很重要:

  • cast(A.col_A as Bigint)可能导致错误
  • cast(B.Col_A as string)从不产生错误

另一方面,转换为整数会删除前导零。这可能是好是坏——取决于它们是否有意义。

至于性能,我建议您同时尝试您的数据并了解哪个版本在您的系统上效果更好。


推荐阅读