1700509300
1700509301
追求“读出快”是一个比追求“写入快”更复杂的课题,因为这取决于读出时的场景。如果按照时间顺序连续写入,且按照时间顺序连续读出,这就是输入非常理想的、读写速度都非常快的情况。平心而论,这种情况太理想了,非常少见。在按照特定的顺序进行连续读取或随机读取的场景中,需要做强排序。Oracle中的索引组织表(Index Organized Table,IOT)就是其中的一种(如图13-5所示)。
1700509302
1700509303
1700509304
1700509305
1700509306
图13-5 堆组织表和索引组织表
1700509307
1700509308
这种表很特殊,在构建时要先声明表的类型为索引组织表,每次插入数据时,整条数据会被直接插入索引表。索引结构在这里既充当了索引结构,又充当了表数据载体。所以,其数据扫描与普通索引相比,不需要通过索引访问ROWID,再跳转到堆组织表。这种组织结构的好处是,只要是根据索引键连续扫描(索引键 BETWEEN a AND b),读出速度都非常快。当然,单条扫描的速度也非常快,只是与普通的索引项相比没有优势(除了在开始插入时需要不断调整这棵“索引树”以外,索引结构的其他劣势并不明显)。关于索引的组织方式,13.5.2节会专门讨论。
1700509309
1700509310
1700509311
1700509312
1700509314
数据科学家养成手册 13.3 文件还是数据库
1700509315
1700509316
在13.2节我们已经讨论过,如果数据库中的数据是供使用者频繁查找的,尤其是扫描所获取的内容在被扫描的数据量中占比很低的情况下,通常不推荐写入程序直接写文件,并把该文件作为查找介质直接使用。在这种场景中,首选肯定是数据库,其数学方面的原理会在13.5.2节讨论。
1700509317
1700509318
数据库作为专业的数据存储和查找引擎,已经有超过30年的历史了,而且其功能越来越强大。以甲骨文著名的数据库产品Oracle为例,其数据库引擎Oracle Database从8i、9i、10g、11g到12c,一路升级,辅助性组件也在不断丰富。与Oracle Database结合最为紧密的有Dataguard和Golden Gate等补充型产品组件。Dataguard提供Oracle Database高可用解决方案,Golden Gate则用来做数据同步。
1700509319
1700509320
数据库作为数据存储的载体,其选型也是有一些讲究的。
1700509321
1700509322
从数据的组织形式来说,目前有两大类,一类是RDBMS(关系型数据库管理系统,Relational Database Management System),另一类是NoSQL(2)。
1700509323
1700509324
RDBMS通常用数据库、表、字段3层对数据进行描述。这种结构应用非常广泛,历史悠久,普及性极高。在这类数据库中,一个数据库(Database)下可以建立若干个表(Table),一个表中可以建立若干个字段(Field)。在一个表的内部,每一行数据都必须具有相同的字段描述。
1700509325
1700509326
NoSQL通常是用数据库、表、键值对3层对数据进行描述。一个数据库下可以建立若干个表。NoSQL和RDBMS的区别在于,NoSQL表内部不设置字段,表内部的每一行数据都用Key-Value键值对来描述,也就是说,每一行的字段都可以不同。
1700509327
1700509328
乍一看这只是形式上不同,其功能都是存储数据,但是它们的使用场景有着比较大的区别。RDBMS注重关系,并且在查找引擎上注重对多表联查(3)的支持和优化,适合做复杂的多维数据分析。而NoSQL表天生就是一种稀疏矩阵的数据逻辑架构,适用于那种在大量不规则的数据结构中查找一条数据的场景,例如博客系统等。由于多表查询很不方便,所以在供分析的数据存储场景中,通常不推荐使用NoSQL类型的数据库。
1700509329
1700509330
在数据量非常大且预算有限的情况下,还是推荐使用开源的Hive、SparkSQL或者PrestoDB on HDFS。这类数据仓库对海量数据的支持特性非常优秀,而且有丰富的文档可以参考。
1700509331
1700509332
1700509333
1700509334
1700509336
数据科学家养成手册 13.4 要不要支持事务
1700509337
1700509338
对于在线数据库OLTP来说,事务通常是比较重要的。事务是指那种一次涉及多个表、多条数据的写操作(4),要求是要么都生效,要么都不生效。
1700509339
1700509340
事务在对业务提供线上支持的数据库中是非常重要的,尤其是对涉及支付的系统,更是必需的。不过,我们所说的日志分析场景中的数据不一定是必需的,而且在我的工作经验中,没有事务的情况似乎更好、更自由。
1700509341
1700509342
在数据分析场景中,通常会使用OLAP数据仓库。常见的OLAP数据仓库有Oracle、DB2、Teradata、Greenplum等。这些数据仓库的特点是吞吐量比较大,尤其是对多表联查的效率支持很高,而其缺点也非常明显,例如对一次涉及几条数据的小事务来说性能支持非常不好。
1700509343
1700509344
如果觉得上述这些数据仓库价格高昂,还有Hive、SparkSQL、PrestoDB on HDFS可以选择。这些分布式数据仓库通常有更高的单次访问延迟,不过这种代价对于OLAP的场景来说无足轻重,关键是获得了极高的可扩展性和大规模数据的读写性能。这个性能的提升主要通过“读写分散”获得,下面我们就以Hive为范例进行讲解。
1700509345
1700509346
Hive在底层是基于HDFS和MapReduce的,写入集群时遵循HDFS的写入原则。只要向Hive的数据仓库里写数据,就必须使用诸如
1700509347
1700509348
LOAD DATA LOCAL INPATH ‘/Linklog_20161122.txt’ OVERWRITE INTO TABLE Linklog PARTITION(dt=‘20161122’);
1700509349
[
上一页 ]
[ :1.7005093e+09 ]
[
下一页 ]