返回列中给定值的第一行 - BigQuery

Posted

技术标签:

【中文标题】返回列中给定值的第一行 - BigQuery【英文标题】:Return First Row For Given Value in a Column - BigQuery 【发布时间】:2018-08-02 17:37:56 【问题描述】:

我有一个非常大的表,其中有一列包含每行的字符串类型的自定义 ID。对于每个 ID,该表中有 50 个属性。这保证在表中是唯一的。

我的主要任务是获取给定 ID 的行中的这 50 个属性。 当我像下面这样运行普通查询时,只扫描 100 万行需要 5 秒。

SELECT * FROM `mytable` WHERE id='123'

据我了解,BigQuery 在将行划分为不同的集群后会并行搜索匹配项。而且我相信对于给定的 ID 值,它将检查所有不同集群中的所有行。这样即使在一个分区中找到匹配项,其他集群也会继续获得其他匹配项。

但是由于 ID 列中的值在这里是唯一的,我们能否以某种方式“破坏”在其他集群上运行的作业,一旦在集群中找到匹配项并返回该行。

我希望这将加快查询运行时间。 此外,在未来,这张表会变得非常大,所以如果能做到这一点,它对我的​​目的真的很有帮助。

欢迎提出任何建议。

【问题讨论】:

【参考方案1】:

您可以使用最近介绍的Clustered Tables 这将使您降低成本并提高性能

请注意:目前仅分区表支持集群 - 但对clustering non-partitioned tables 的支持正在开发中

如果你的表是分区的,你可以通过 id 对它进行集群 - 你就完成了 如果没有 - 您可以引入“假”日期字段并通过它进行分区,以便该表可以使用集群

同时,如果您只对给定 ID 的一行感兴趣 - 请在下方尝试

SELECT * FROM mytable WHERE id='123' LIMIT 1

【讨论】:

感谢米哈伊尔的创意。会深入研究。不幸的是,SELECT * FROM mytable WHERE id='123' LIMIT 1 在这种情况下没有任何改进。 是的。使用聚簇表将查询时间减少到约 2 秒,数据处理到只有几个字节,而之前它是 230MB。而且我相信即使表大小增加,它也应该提供几乎相同的性能。

以上是关于返回列中给定值的第一行 - BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

返回包含文本值的列的列名

如何在多个列中找到最常用的值?

计算一行中空值的数量以除以(未知)列数

2021-08-13:给定一个每一行有序每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数。

DolphinDB:如何获取每个滑动组的最大值的第一行?

如何在R中的一列中添加具有不同值的新行