sql - 从 String 到 Bigint 或其他方式 - 更喜欢什么?
问题描述
语境
我必须加入的两个表具有用于加入不同基础数据类型的同一列:
| --------- Table A -----------| | --------- Table B -----------|
| Col_A (String) | Col_B | ... | | Col_A (Bigint) | Col_B | ... |
|------------------------------| |------------------------------|
| 1233456 | ... | ... | | 1233456 | ... | ... |
|------------------------------| |------------------------------|
当然,如果两个表都已经Bigint
作为数据类型,它会更有效,但它就是这样。因此,我必须在连接期间强制转换其中一列。
由于答案可能非常依赖于使用的数据库等:我正在使用parquet
-table 创建和查询Impala
or Hive
。因此,对于表统计信息,使用 Hive 的 Metastore。
问题
如果我想要计算成本较低的联接,我应该投哪一列?
换句话说:将 a转换为 a或相反的计算成本更高吗?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)
解决方案
这两种方法之间存在差异,这可能很重要:
cast(A.col_A as Bigint)
可能导致错误cast(B.Col_A as string)
从不产生错误
另一方面,转换为整数会删除前导零。这可能是好是坏——取决于它们是否有意义。
至于性能,我建议您同时尝试您的数据并了解哪个版本在您的系统上效果更好。
推荐阅读
- android - 如何在 android 上模拟 NFC 标签?
- javascript - 在 Lit-Html 中发布请求
- forms - 注册用户并让用户使用 Typo3 登录
- javascript - 如何发布 JS 谷歌登录表单的“用户名”?
- cassandra - Cassandra 3.11,nodetool重建失败
- python - 通过python发送HTTP请求
- java - 如何在apache中从角度调用spring boot api
- android - android webview中的谷歌登录卡在一个页面中,提示“请稍等”和一个加载进度条
- python-3.x - 从网页上的下拉值中抓取网页
- python - Keras 模型停止训练,但没有说明为什么以及如何启用 GPU 加速