【发布时间】:2021-12-11 11:50:15
【问题描述】:
我有一个 BigQuery 表,我想按低基数字符串列进行分区。这是不可能的,所以我必须将字符串散列成整数并按整数分区。我做了一个非常简单的散列算法,将这些字符串转换为 0 到 100 之间的整数。
到目前为止一切顺利,我创建了一个由这个新整数字段分区的新表,它只是另一个字段的函数。现在我可以通过分区整数字段查询这张表,大大减少了流量。凉爽的!但我真的很想通过字符串字段查询,所以我做了一个用户定义的函数,它基本上是做散列的,所以我可以写这样的查询:
SELECT * FROM `partitioned_table` WHERE partitioned_int_field = HashOf("abc")
与此基本相同,但性能更高:
SELECT * FROM `partitioned_table` WHERE unpartitioned_string_field = "abc"
现在的问题是,如果我将用户定义的函数 HashOf 创建为 SQL(例如,只是幼稚的情况)它工作得很好,流量会按预期减少。但是,如果我将函数创建为 JavaScript(这里更可取),那么它对流量没有影响。查询有效,但需要全表扫描。 SQL 和 JavaScript 版本都返回完全相同的结果,但 JavaScript 版本并没有像看起来那样修剪分区。
我错过了什么吗?为什么 JavaScript 用户定义函数即使为分区字段返回正确的整数值,也不修剪分区?
【问题讨论】:
标签: google-bigquery