【问题标题】:Converting SQL statements with SUM, ROUND & COUNT into GQL将带有 SUM、ROUND 和 COUNT 的 SQL 语句转换为 GQL
【发布时间】:2015-05-30 11:15:04
【问题描述】:

我正在使用官方 PHP API SDK 和“tomwalder/php-gds”与 Google Datastore 进行交互。

Google 数据存储区(和 GQL)非常适合我处理的 99% 的数据(列数少、数据结构一致、数十亿行),除了少数查询。

我遇到的最大问题是将这条 SQL 语句转换为 GQL:

SELECT column_a, ROUND(SUM(column_b),0) as total_score, COUNT(column_a) as company_name 
FROM companies 
WHERE column_a <> '' AND column_c = '2015-05-30'
GROUP BY column_a 
ORDER BY total_score desc;

如果 GQL 中没有 ROUND、SUM 或 COUNT,那么将数据缓冲到内存并使用 PHP 运行计算是唯一的选择吗? 每个查询有 20MB 的数据,这似乎不是最有效的途径。我真的不想迁移到 BigQuery,因为我喜欢 Datastore 在读取数据时的响应能力。

【问题讨论】:

标签: php google-app-engine


【解决方案1】:

您不能通过 Datastore 廉价或轻松地使用聚合函数。

您需要以不同的方式解决问题并在应用层中维护计数/总和等。

这是对传统(强大)MySQL 灵活性的范式转变。

我个人将两者一起使用。

CloudSQL 用于聚合和报告由我的应用程序层更新的数据。

附:感谢您使用 PHP-GDS!如果您想提出请求,我正在考虑将一些聚合帮助实用程序添加到 GitHub 上。

汤姆

【讨论】:

  • 澄清一下,如果您要将聚合数据存储在 Datastore 中,我的建议是在您的应用层中维护/预先计算。
  • Google IO 一年有一个不错的比较视频,讨论 Datastore 与 SQL。我会尝试挖掘链接...
  • 如果您不预先计算所有内容,您可以使用 MapReduce/dataflow 来完成,但成本很高。
猜你喜欢
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多