大数据数据库:从 SQL 到 NoSQL 和 NewSQL
1. 关系数据库与结构化查询语言(SQL)
1.1 SQL 基本操作
在处理数据库时, pandas 的 read_sql 方法在幕后使用 Cursor 来执行查询并访问结果行。下面我们来看看 SQL 中常见的插入、更新和删除操作。
1.1.1 插入操作(INSERT INTO)
INSERT INTO 语句用于向表中插入一行数据。例如,我们要向 authors 表中插入一个名为 Sue Red 的新作者:
cursor = connection.cursor()
cursor = cursor.execute("""INSERT INTO authors (first, last)
VALUES ('Sue', 'Red')""")
这里, INSERT INTO 关键字后面跟着要插入新行的表名,括号内是用逗号分隔的列名列表。列名列表后面是 VALUES 关键字和括号内用逗号分隔的值列表。需要注意的是,我们没有为 id 列指定值,因为它是 authors 表中的自增列,SQLite 会为每一行分配一个唯一的 id 值。
1.1.2 单引号字符串处理
在 SQL 中,字符串用单引号( ' )分隔。如果字符串中包含单引号,比如 O’Malley ,必须在单引号出现的位置使用两个单引号(例如 'O''Malley' ),第一个单引号作为第二个单引号的转义字符。
1.1.3 更新操作(UPDATE)
UPDATE 语句用于修改现有值。假设数据库中 Sue Red 的姓氏有误,我们将其更新为 Black :
cursor = cursor.execute("""UPDATE authors SET last='Black'
WHERE last='Red' AND first='Sue'""")
UPDATE 关键字后面跟着要更新的表名, SET 关键字和用逗号分隔的 column_name = value 对,表示要更改的列及其新值。如果不指定 WHERE 子句,更改将应用于每一行。为了确保只修改一行,最好在 WHERE 子句中使用行的唯一主键。
1.1.4 删除操作(DELETE FROM)
DELETE FROM 语句用于从表中删除行。我们使用 Sue Black 的作者 ID 从 authors 表中删除她:
cursor = cursor.execute('DELETE FROM authors WHERE id=6')
可选的 WHERE 子句决定要删除哪些行。如果省略 WHERE 子句,将删除表中的所有行。
1.1.5 关闭数据库连接
当不再需要访问数据库时,应调用 Connection 的 close 方法断开与数据库的连接:
connection.close()
1.2 操作示例代码及结果
以下是上述操作的完整示例代码及结果:
import pandas as pd
# 插入操作
cursor = connection.cursor()
cursor = cursor.execute("""INSERT INTO authors (first, last)
VALUES ('Sue', 'Red')""")
# 查询 authors 表内容
result = pd.read_sql('SELECT id, first, last FROM authors',
connection, index_col=['id'])
print(result)
输出结果:
first last
id
1 Paul Deitel
2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Alexander Wald
6 Sue Red
# 更新操作
cursor = cursor.execute("""UPDATE authors SET last='Black'
WHERE last='Red' AND first='Sue'""")
# 确认更新的行数
print(cursor.rowcount)
# 再次查询 authors 表内容
result = pd.read_sql('SELECT id, first, last FROM authors',
connection, index_col=['id'])
print(result)
输出结果:
1
first last
id
1 Paul Deitel
2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Alexander Wald
6 Sue Black
# 删除操作
cursor = cursor.execute('DELETE FROM authors WHERE id=6')
# 确认删除的行数
print(cursor.rowcount)
# 最后查询 authors 表内容
result = pd.read_sql('SELECT id, first, last FROM authors',
connection, index_col=['id'])
print(result)
输出结果:
1
first last
id
1 Paul Deitel
2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Alexander Wald
1.3 操作流程总结
下面是 SQL 插入、更新和删除操作的流程图:
graph TD;
A[开始] --> B[插入操作];
B --> C[更新操作];
C --> D[删除操作];
D --> E[关闭数据库连接];
E --> F[结束];
2. NoSQL 和 NewSQL 大数据数据库概述
2.1 SQL 在大数据中的重要性
随着大数据的发展,SQL 的重要性日益增加。例如,我们可以使用 Spark SQL 来查询分布在 Spark 集群中多台计算机上的 Spark DataFrame 中的数据,Spark SQL 与本节介绍的 SQL 非常相似。
2.2 NoSQL 数据库
传统的关系数据库管理系统要求数据是结构化的,适合整齐的矩形表。随着数据规模和表及关系数量的增加,关系数据库的高效操作变得越来越困难。在当今的大数据世界中,NoSQL 和 NewSQL 数据库应运而生,以满足传统关系数据库无法满足的数据存储和处理需求。
2.2.1 NoSQL 数据库分类
NoSQL 最初的含义如其名称所示,但随着 SQL 在大数据中的重要性不断增加,现在 NoSQL 被认为代表 “Not Only SQL”。NoSQL 数据库适用于非结构化数据(如照片、视频、电子邮件、短信和社交媒体帖子中的自然语言)和半结构化数据(如 JSON 和 XML 文档)。NoSQL 数据库主要分为以下四类:
| 数据库类型 | 特点 | 示例 |
| ---- | ---- | ---- |
| 键值数据库(Key–Value) | 存储键值对,针对分布式系统和大数据处理进行了优化,倾向于在多个集群节点中复制数据 | Redis、HBase、Amazon DynamoDB、Google Cloud Datastore、Couchbase |
| 文档数据库(Document) | 存储半结构化数据,如 JSON 或 XML 文档,通常为特定属性添加索引以更高效地定位和操作文档 | MongoDB、Amazon DynamoDB、Microsoft Azure Cosmos DB、Apache CouchDB |
| 列族数据库(Columnar) | 类似于关系数据库,但以列而不是行的形式存储结构化数据,选择给定列的所有数据更高效 | MariaDB ColumnStore、HBase |
| 图数据库(Graph) | 存储节点、边及其属性,用于建模对象之间的关系 | Neo4j |
2.2.2 NoSQL 数据库详细介绍
- 键值数据库(Key–Value) :类似于 Python 字典,键值数据库存储键值对,但针对分布式系统和大数据处理进行了优化。为了提高可靠性,它们倾向于在多个集群节点中复制数据。一些键值数据库(如 Redis)在内存中实现以提高性能,而其他数据库(如 HBase)将数据存储在磁盘上。
- 文档数据库(Document) :文档数据库存储半结构化数据,如 JSON 或 XML 文档。为了更高效地定位和操作文档,通常会为特定属性添加索引。例如,在存储 IoT 设备生成的 JSON 文档时,可以为
type属性添加索引,以便根据文档类型进行过滤。 - 列族数据库(Columnar) :在关系数据库中,常见的查询操作是获取每一行中特定列的值。由于数据按行组织,选择特定列的查询性能可能较差。列族数据库以列而不是行的形式存储结构化数据,因此选择给定列的所有数据更高效。
- 图数据库(Graph) :图用于建模对象之间的关系,对象称为节点(或顶点),关系称为边。边是有方向的。图数据库存储节点、边及其属性。许多公司使用图数据库创建推荐引擎,例如 Amazon 和 Netflix。
2.3 NewSQL 数据库
关系数据库的关键优势包括安全性和事务支持,通常使用 ACID(原子性、一致性、隔离性、持久性)事务:
- 原子性(Atomicity) :确保只有当事务的所有步骤都成功时,数据库才会被修改。
- 一致性(Consistency) :确保数据库状态始终有效。
- 隔离性(Isolation) :确保并发事务的执行就像它们是顺序执行的一样。
- 持久性(Durability) :确保即使发生硬件故障,数据库的更改也能保留。
NoSQL 数据库通常不提供 ACID 支持,许多 NoSQL 数据库遵循 BASE(基本可用性、软状态、最终一致性)模型,更注重数据库的可用性。NewSQL 数据库结合了关系数据库和 NoSQL 数据库的优点,适用于大数据处理任务。一些流行的 NewSQL 数据库包括 VoltDB、MemSQL、Apache Ignite 和 Google Spanner。
2.4 MongoDB 案例研究
MongoDB 是一个能够存储和检索 JSON 文档的文档数据库。Twitter 的 API 以 JSON 对象的形式返回推文,我们可以直接将其写入 MongoDB 数据库。
2.4.1 操作,总结及展示
- 使用 Tweepy 流式传输关于 100 位美国参议员的推文,并将其存储到 MongoDB 数据库中 。
- 使用 pandas 总结推文活动最多的前 10 位参议员 。
- 在交互式的 Folium 美国地图上显示每个州的弹出标记,显示州名、两位参议员的姓名、他们的政党和推文计数 。
2.4.2 安装所需的 Python 库
要与 MongoDB 数据库进行交互,需要安装 pymongo 库,连接到 MongoDB Atlas 集群还需要 dnspython 库。可以使用以下命令进行安装:
conda install -c conda-forge pymongo
conda install -c conda-forge dnspython
2.4.3 创建 MongoDB Atlas 集群
创建 MongoDB Atlas 集群的步骤如下:
1. 访问 https://mongodb.com 注册免费账户,输入电子邮件地址并点击 “Get started free”。
2. 在下一步中,输入姓名并创建密码,阅读服务条款,同意后点击 “Get started free”,进入集群设置页面。
3. 点击 “Build my first cluster” 开始创建集群,为集群命名,然后点击 “Create Cluster”。
4. 出现 “Connect to Atlas” 弹出教程,按照以下步骤操作:
- 创建第一个数据库用户,以便登录集群。
- 白名单你的 IP 地址,这是一项安全措施,确保只有你验证的 IP 地址才能与集群交互。
- 连接到集群,获取集群的连接字符串,以便 Python 代码连接到服务器。
2.5 创建集群流程
graph TD;
A[访问官网注册] --> B[设置集群信息];
B --> C[创建集群];
C --> D[连接集群设置];
D --> E[创建数据库用户];
D --> F[白名单 IP 地址];
D --> G[获取连接字符串];
E --> H[完成];
F --> H;
G --> H;
2.6 创建数据库用户步骤
创建第一个数据库用户的具体步骤如下:
1. 在 “Connect to Atlas” 弹出教程窗口中,点击 “Create your first database user” 继续教程。
2. 按照屏幕提示查看集群的 “Security” 选项卡,然后点击 “+ ADD NEW USER”。
3. 在 “Add New User” 对话框中,创建用户名和密码,并记录下来,后续会用到。
4. 点击 “Add User” 返回 “Connect to Atlas” 弹出教程。
2.7 白名单 IP 地址步骤
白名单 IP 地址的操作步骤如下:
1. 在 “Connect to Atlas” 弹出教程窗口中,点击 “Whitelist your IP address” 继续教程。
2. 按照屏幕提示查看集群的 “IP Whitelist”,然后点击 “+ ADD IP ADDRESS”。
3. 在 “Add Whitelist Entry” 对话框中,有两种选择:
- 可以添加计算机的当前 IP 地址。
- 也可以选择 “ALLOW ACCESS FROM ANYWHERE”,不过这在生产数据库中不被推荐,但用于学习目的是可以的。
4. 点击 “Confirm” 返回 “Connect to Atlas” 弹出教程。
2.8 连接到集群步骤
连接到集群并获取连接字符串的步骤如下:
1. 在 “Connect to Atlas” 弹出教程窗口中,点击 “Connect to your cluster” 继续教程。
2. 按照屏幕提示查看集群的 “Connect to YourClusterName” 对话框。
3. 连接到 MongoDB Atlas 数据库需要一个连接字符串,点击 “Connect Your Application”,然后点击 “Short SRV connection string” 获取连接字符串。
2.9 配置 keys.py 文件
ch16 示例文件夹的 TwitterMongoDB 子文件夹包含此示例的代码和 keys.py 文件。需要编辑这个文件,包含你的 Twitter 凭证和从 “Data Mining Twitter” 章节获取的 OpenMapQuest 密钥。在创建好 MongoDB Atlas 集群后,还需要将 MongoDB 连接字符串添加到这个文件中。
2.10 总结
本文详细介绍了关系数据库与 SQL 的基本操作,包括插入、更新、删除等操作,同时给出了具体的代码示例和操作流程。接着探讨了 NoSQL 和 NewSQL 大数据数据库,介绍了 NoSQL 数据库的四种类型(键值数据库、文档数据库、列族数据库、图数据库)及其特点和示例,还阐述了 NewSQL 数据库结合关系数据库和 NoSQL 数据库优点的特性。最后以 MongoDB 为例,展示了如何使用它来存储和处理 Twitter 推文数据,包括安装所需 Python 库、创建 MongoDB Atlas 集群、配置相关信息等步骤。
通过这些内容,我们可以看到不同类型数据库在大数据处理中的应用场景和优势,开发者可以根据具体需求选择合适的数据库来处理和存储数据。例如,对于结构化数据,关系数据库和 SQL 是不错的选择;而对于非结构化和半结构化数据,NoSQL 数据库则更具优势;NewSQL 数据库则在需要兼顾关系数据库特性和大数据处理能力时发挥作用。
以下是一个简单的表格总结不同类型数据库的特点:
| 数据库类型 | 数据结构 | 适用场景 | 优势 |
| ---- | ---- | ---- | ---- |
| 关系数据库 | 结构化数据,矩形表 | 数据结构固定、需要事务处理的场景 | 安全性高、支持 ACID 事务 |
| 键值数据库 | 键值对 | 缓存、会话管理等 | 分布式处理、高可用性 |
| 文档数据库 | 半结构化数据(JSON、XML) | 存储和处理灵活的数据 | 灵活的数据模型、可扩展性强 |
| 列族数据库 | 以列存储结构化数据 | 数据分析、数据仓库 | 高效的列查询 |
| 图数据库 | 节点、边及其属性 | 社交网络分析、推荐系统 | 强大的关系建模能力 |
| NewSQL 数据库 | 结合关系和 NoSQL 特点 | 大数据处理,需要事务支持 | 兼顾关系数据库和 NoSQL 优势 |
希望这些信息能帮助你更好地理解和应用不同类型的数据库,在实际项目中做出更合适的选择。
2.11 操作步骤总结列表
- SQL 操作 :
- 插入操作:使用
INSERT INTO语句,指定表名和列名及对应值。 - 更新操作:使用
UPDATE语句,指定要更新的表、列和新值,可通过WHERE子句限定更新范围。 - 删除操作:使用
DELETE FROM语句,可通过WHERE子句限定删除范围。 - 关闭数据库连接:使用
connection.close()方法。
- 插入操作:使用
- MongoDB 操作 :
- 安装 Python 库:使用
conda install -c conda-forge pymongo和conda install -c conda-forge dnspython安装所需库。 - 创建 MongoDB Atlas 集群:访问官网注册,设置集群信息,创建集群。
- 配置集群:创建数据库用户、白名单 IP 地址、获取连接字符串。
- 配置
keys.py文件:添加 Twitter 凭证、OpenMapQuest 密钥和 MongoDB 连接字符串。
- 安装 Python 库:使用
通过以上步骤和介绍,你可以逐步掌握不同类型数据库的基本操作和应用,为大数据处理和存储打下坚实的基础。
超级会员免费看
36

被折叠的 条评论
为什么被折叠?



