谷歌BigQuery/亚马逊Redshift使用列式关系数据库还是NoSQL数据库?

12
我仍然不太清楚基于列的关系型数据库与基于列的NoSQL数据库之间的区别。
Google BigQuery支持类似SQL的查询,那它怎么能算是NoSQL呢?
我知道的基于列的关系型数据库有InfoBright、Vertica和Sybase IQ。
我知道的基于列的NoSQL数据库有Cassandra和HBase。
以下这篇关于Redshift的文章一开始使用了“NoSQL”,但最后却使用了关系型数据库PostgreSQL: http://nosqlguide.com/column-store/intro-to-amazon-redshift-a-columnar-nosql-database/
2个回答

24

这里需要澄清一些有关Google BigQuery的事情。

BigQuery是一个 混合型 系统,它允许您将数据存储在列中,并且通过额外的功能将其带入NoSQL领域,例如 record 类型和 nested 功能。此外,您可以在一个2M字节的字符串列中存储原始文档,例如 JSON 文档。请参阅其他适用的数据格式和限制。您还可以使用JavaScript编写用户定义函数,例如:您可以粘贴一个执行NLP JavaScript库的库。

现在您拥有了所有这些存储数据的功能,您可以使用JSON函数来查询存储在其中一个列中的文档,因此这可以用作无模式存储,因为您没有为该列定义JSON文档结构,而只是将其存储为JSON格式。明白了吗?

以下是一个基本示例,从元列中查询(即一个JSON文档),查找原因键中包含“取消订阅”单词的用户数量:

SELECT 
  SUM(IF(JSON_EXTRACT_SCALAR(meta,'$.reason') contains 'unsubscribed',1,0))  
FROM ...

另一方面,您可以使用表通配符查询。如果您的行跨越多个表,则需要使用它。表通配符函数是从特定一组表中查询数据的一种经济实惠的方式。当您使用表通配符函数时,BigQuery仅访问和收费与通配符匹配的表。这意味着建议将数据存储在类似的表中,每个表按一组时间框架划分,例如每天,每月表。

我们不应忘记,BigQuery的设计是只追加而不更新,因此您无法更新旧记录,没有UPDATE语言结构更新:现在有DML语言结构来执行某些更新/删除操作)。相反,您需要追加新记录,并且您的查询必须编写成始终使用数据的最新版本。如果您的系统是事件驱动的,则非常简单,因为每个事件都将附加到BQ中。但是,如果用户更新其个人资料,则需要再次存储个人资料,不能更新旧行。您需要有一个列版本/日期,以告诉您哪个是最新版本,然后您的查询将首先获取行的最新版本,然后处理逻辑。

您可以使用类似于over/partition by该字段,并使用最近值seqnum=1的方法。

这将从profile返回每个user_id的最后一个email,由timestamp列定义的最近条目。

SELECT email
   FROM
     (SELECT email
             row_number() over (partition BY user_id
                                ORDER BY TIMESTAMP DESC) seqnum
      FROM [profile]
    )
   WHERE seqnum=1

6

首先,需要记住的是,NOSQL通常被认为是“Not Only SQL”的缩写,因此系统既有SQL接口,也有一些NOSQL特性并不矛盾。 话虽如此,Redshift和BigQuery都以列为基础的数据库为基础。 Redshift基于Paraccel,这是一个专门针对数据仓库的经典基于列的RDBMS,而BigQuery基于Google内部的基于列的数据处理技术“dremel”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接