在 BigQuery 中按 LOWER 高效排序
Posted
技术标签:
【中文标题】在 BigQuery 中按 LOWER 高效排序【英文标题】:Efficiently sorting by LOWER in BigQuery 【发布时间】:2018-03-08 00:48:55 【问题描述】:这篇精彩的 blog posts 谈到了在 where 子句中使用 LOWER()
的低效率以及更有效的文本搜索方式。在ORDER BY
子句中有类似的方法吗?例如:
SELECT * FROM mytable
ORDER BY LOWER(first_name)
按字段名称的小写文本进行排序的最有效方法是什么,例如在按列排序时在 Google 表格或 Excel 中进行排序?
【问题讨论】:
来自相应 SO 帖子的重要说明 -Note from the team: Stay tuned! Very soon BigQuery will turn this advice irrelevant.
你看到了吗? :o)
@MikhailBerlyant 是的,我也注意到了这一点。不知道什么时候会实施。我每天都会查看他们的发布文档。
有些事情已经更快了——您尝试过博客文章中的查询吗?我认为在解决所有已知问题之前我们不会更新发行说明,但前几个查询只需要大约 4 或 5 秒而不是 10 秒。我不认为 ORDER BY LOWER(...) 在任何情况下都应该很慢。
很棒的博客/帖子;很棒的团队!!! :o)
完全正确 - 我现在必须在博客上写一篇文章 :)
【参考方案1】:
引用博客中的 RegExp 方法将不起作用/适用于此处(对于 ORDER BY
),因为用于 BigQuery 正则表达式支持的 re2
库不支持相应的所需功能
特别是 - re2 不支持在正则表达式替换中更改大小写
如果它会被支持 - 你可以使用类似的东西
REGEXP_REPLACE(first_name, r'.*', r'\L\0') <-- just mockup - does not work with BigQuery
这里\L
- 将所有后续标记转换为它们各自的小写等效项
和\0
(BQ 支持)匹配整个模式,因此整个first_name
列将替换为相应的小写版本
见例子here
但是 - 再次 - BigQuery / re2 不支持 \L
【讨论】:
以上是关于在 BigQuery 中按 LOWER 高效排序的主要内容,如果未能解决你的问题,请参考以下文章