1700509290
1700509291
1700509292
1700509293
1700509294
现在越来越多的数据收集场景中不再直接使用文本文件进行数据保存的原因也在这里。如果使用文本文件,那就纯粹是做压缩归档保存,以备未来进行审计或深度分析时使用。
1700509295
1700509297
13.2.2 读出最快
1700509298
1700509299
如果要让文件以最快的速度读出,就需要在文件写入磁盘之前进行排序处理。最常见的方式应该是在文件内容层面建立索引,并实时维护索引文件。这个过程非常复杂,非专业人士通常不会选择用这种方式来直接操作文件。更好的方式是使用数据库中的相应功能来实现。
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
[
上一页 ]
[ :1.70050929e+09 ]
[
下一页 ]