上下文
我必须联接的两个表具有用于联接不同基础数据类型的相同列:
| --------- Table A -----------| | --------- Table B -----------|
| Col_A (String) | Col_B | ... | | Col_A (Bigint) | Col_B | ... |
|------------------------------| |------------------------------|
| 1233456 | ... | ... | | 1233456 | ... | ... |
|------------------------------| |------------------------------|
当然,如果两个表都有 Bigint
作为数据类型,但它是如何。因此,我必须在连接期间转换其中一个列。
因为答案可能非常依赖于所使用的数据库等:我使用的是 parquet
-使用创建和查询的表 Impala
或者 Hive
. 因此,对于表statistics,hive的metastore被使用。
问题
如果我想要计算成本较低的联接,我应该转换哪个列?
换言之:计算成本是否更高 String
到 Bigint
或者反过来?
不幸的是,在我的集群中,我无法以可靠的方式测试计时。此外,我无法通过查看文档来回答这个问题。
-- 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)
1条答案
按热度按时间bvpmtnay1#
两种方法之间存在差异,这可能需要考虑:
cast(A.col_A as Bigint)
可能导致错误cast(B.Col_A as string)
从不产生错误另一方面,转换为整数会删除前导零。这可能是好的也可能是坏的——这取决于它们是否有意义。
至于性能,我建议您在数据上都尝试一下,并了解哪个版本在您的系统上工作得更好。