我还不太清楚基于列的关系数据库与基于列的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/
答案 0 :(得分:14)
这里要说明的一些事情主要是关于Google BigQuery。
BigQuery是一个 混合 系统,它允许您将数据存储在列中,但它通过其他功能进入NoSQL世界,例如record
类型和nested
功能。您还可以拥有一个2Mbyte STRING列,您可以在其中存储原始文档,如JSON
文档。请参阅适用的其他data formats and limits。您也可以在Javascript中编写用户定义的函数,例如:您可以粘贴到一个执行NLP javascript库的库中。
现在您拥有了存储数据的所有这些功能,您可以使用JSON Functions来查询存储在其中一列中的文档,因此可以将其用作无模式存储,因为您没有定义您的JSON文档结构,您只需将其存储为JSON。知道了吗?
从元列查询的基本示例,它是一个JSON文档,原因键,并执行一个包含语言构造,以找出该键中有多少用户拥有“未订阅”单词:
SELECT
SUM(IF(JSON_EXTRACT_SCALAR(meta,'$.reason') contains 'unsubscribed',1,0))
FROM ...
另一方面,您有 table-wildcard querying 。如果您的行跨多个表,则需要这样做。表通配符函数是从一组特定表中查询数据的经济有效的方法。当您使用表通配符函数时,BigQuery仅访问并向您收取与通配符匹配的表的费用。所以这意味着建议将数据存储在类似的表中,只需按照设定的时间范围划分在不同的表中,例如:每日,每月表。
我们不应忘记 BigQuery只能通过设计附加,因此您无法更新旧记录,没有UPDATE语言构造(更新 >:现在有DML language construct来做一些更新/删除操作)。相反,您需要附加一条新记录,并且您的查询必须以始终与最新版本的数据一起使用的方式编写。如果您的系统是事件驱动的,那么这非常简单,因为每个事件都将附加在BQ中。但是如果用户更新了它的配置文件,则需要再次存储配置文件,不能更新旧行。您需要有一个列版本/日期,告诉您哪个是最新版本,并且您的查询将首先写入以获取最新版本的行,然后处理逻辑。
您可以使用该字段的over / partition之类的内容,并使用最新值seqnum=1
。
这将从profile
返回,email
列为user_id
列最新条目定义的每个timestamp
的最后一个SELECT email
FROM
(SELECT email
row_number() over (partition BY user_id
ORDER BY TIMESTAMP DESC) seqnum
FROM [profile]
)
WHERE seqnum=1
。
{{1}}
答案 1 :(得分:4)
首先,请记住,NOSQL通常被认为是“Not Only SQL”的缩写,因此系统同时具有SQL接口和一些NOSQL功能并不矛盾。 话虽如此,Redshift和BigQuery都有基于列的数据库的基础。 Redshift基于Paraccel,它是基于经典列的RDBMS,面向数据仓库,BigQuery基于谷歌基于列的内部数据处理技术,称为“dremel”。