第三章:Crawl4AI 数据采集与处理


文档摘要

第三章:Crawl4AI 数据采集与处理 第三章:Crawl4AI 数据采集与处理 3.1 引言:Crawl4AI 的基石 - 数据 数据采集与处理是 Crawl4AI 流程中至关重要的第一步,它直接决定了后续模型训练和应用效果的上限。如同建筑的地基,高质量的数据是构建强大 AI 系统的基础。如果数据采集环节出现偏差,例如抓取了大量噪声数据、低质量信息或者与 AI 任务无关的内容,那么后续的数据处理和模型训练将事倍功半,甚至导致整个项目失败。因此,深入理解和掌握 Crawl4AI 数据采集与处理技术,对于任何希望利用网络数据驱动 AI 创新的团队和个人而言,都至关重要。

第三章:Crawl4AI 数据采集与处理

第三章:Crawl4AI 数据采集与处理

3.1 引言:Crawl4AI 的基石 - 数据

数据采集与处理是 Crawl4AI 流程中至关重要的第一步,它直接决定了后续模型训练和应用效果的上限。如同建筑的地基,高质量的数据是构建强大 AI 系统的基础。如果数据采集环节出现偏差,例如抓取了大量噪声数据、低质量信息或者与 AI 任务无关的内容,那么后续的数据处理和模型训练将事倍功半,甚至导致整个项目失败。因此,深入理解和掌握 Crawl4AI 数据采集与处理技术,对于任何希望利用网络数据驱动 AI 创新的团队和个人而言,都至关重要。

本章将从数据采集的规划、网络爬虫的构建、数据清洗、数据转换、数据存储以及数据质量评估等多个维度展开,并结合代码实践和图文详解,力求全面而深入地剖析 Crawl4AI 数据采集与处理的各个方面。通过学习本章内容,读者将能够掌握构建高效 Crawl4AI 数据 pipeline 的核心技能,为后续的 AI 模型开发和应用奠定坚实的基础。

3.2 数据采集:网络信息的精准捕获

数据采集是 Crawl4AI 的起点,其核心目标是从浩如烟海的网络信息中,精准、高效地抓取符合 AI 任务需求的数据。数据采集的质量直接影响后续数据处理和模型训练的效果。本节将详细介绍数据采集的关键步骤和技术方法。

3.2.1 明确采集目标与需求分析

在启动任何 Crawl4AI 项目之前,首要任务是明确采集目标和进行需求分析。这包括:

  • 确定 AI 任务类型: 例如,是构建自然语言处理(NLP)模型、计算机视觉(CV)模型还是推荐系统?不同的 AI 任务对数据类型、格式和特征有着不同的要求。

  • 定义所需数据类型: 例如,对于 NLP 任务,可能需要文本数据(新闻、评论、论坛帖子等);对于 CV 任务,可能需要图像数据(商品图片、风景照片、人脸图像等);对于推荐系统,可能需要用户行为数据(点击、浏览、购买记录等)。

  • 确定数据来源网站: 根据所需数据类型,选择合适的网站作为数据来源。例如,新闻数据可以从新闻网站抓取,商品图片可以从电商网站抓取,社交媒体数据可以从社交平台抓取。

  • 分析数据结构和网页布局: 目标网站的网页结构和数据布局直接影响爬虫的设计和数据提取的难度。需要分析目标网页的 HTML 结构,识别目标数据所在的标签和属性。

  • 考虑数据量和采集频率: 根据 AI 任务的需求和资源限制,确定需要采集的数据量和采集频率。例如,是需要一次性采集大量数据,还是需要定期增量采集数据?

明确采集目标和需求分析是 Crawl4AI 项目成功的基石。只有清晰地了解需要什么数据,才能有效地设计爬虫并进行后续的数据处理。

3.2.2 网络爬虫的构建与实现

网络爬虫是 Crawl4AI 数据采集的核心工具。其基本工作原理是模拟浏览器行为,发送 HTTP 请求到目标网站,解析 HTML 响应,提取目标数据,并根据预设的规则继续爬取相关网页。构建高效、稳定的网络爬虫是 Crawl4AI 数据采集的关键。

1. 基础爬虫框架:Requests 和 Beautiful Soup

对于简单的爬虫任务,可以使用 Python 的 requests 库发送 HTTP 请求,Beautiful Soup 库解析 HTML 响应。

import requests from bs4 import BeautifulSoup def simple_crawler(url): try: response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}) # 模拟浏览器请求头 response.raise_for_status() # 检查请求是否成功 soup = BeautifulSoup(response.content, 'html.parser') # 使用 Beautiful Soup 解析 HTML # 在 soup 对象中查找目标数据,例如: title = soup.find('h1').text.strip() if soup.find('h1') else 'No Title' content = soup.find('div', class_='article-content').text.strip() if soup.find('div', class_='article-content') else 'No Content' print(f"Title: {title}") print(f"Content: {content}") return {'title': title, 'content': content} except requests.exceptions.RequestException as e: print(f"请求失败: {e}") return None except AttributeError as e: print(f"解析失败: {e}") # 网页结构可能发生变化 return None if __name__ == '__main__': url = "https://example.com/article" # 替换为目标文章链接 data = simple_crawler(url) if data: print("数据采集成功!")

代码详解:

  • requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}): 使用 requests 库发送 GET 请求到目标 URL。 headers 参数用于设置请求头,User-Agent 模拟浏览器身份,避免被网站识别为爬虫而拒绝访问。

  • response.raise_for_status(): 检查 HTTP 响应状态码,如果请求失败(例如 404, 500),会抛出异常,方便错误处理。

  • BeautifulSoup(response.content, 'html.parser'): 使用 Beautiful Soup 解析 HTML 响应内容。 'html.parser' 是 HTML 解析器,也可以选择 'lxml' 等更高效的解析器。

  • soup.find('h1').text.strip(): 使用 Beautiful Soupfind() 方法查找 HTML 文档中第一个 <h1> 标签,.text 获取标签内的文本内容,.strip() 去除文本首尾的空白字符。

  • soup.find('div', class_='article-content'): 使用 find() 方法和 class_ 参数查找 class 属性为 'article-content'<div> 标签。

  • 异常处理 try...except: 使用 try...except 块捕获可能发生的异常,例如网络请求失败 (requests.exceptions.RequestException) 和 HTML 解析错误 (AttributeError),保证程序的健壮性。

2. 高级爬虫框架:Scrapy

对于大规模、复杂的爬虫任务,建议使用更强大的爬虫框架,例如 Scrapy。Scrapy 是一个基于 Python 的开源爬虫框架,提供了完善的爬虫组件和架构,可以高效地构建和管理爬虫项目。

Scrapy 框架的核心组件包括:

  • Spiders (爬虫): 定义如何爬取特定网站,包括起始 URL、页面解析规则和数据提取逻辑。

  • Items (数据项): 定义要提取的数据字段,类似于数据模型。

  • Item Pipelines (数据管道): 处理 Spider 提取的 Item,例如数据清洗、验证、存储等。

  • Downloader Middlewares (下载器中间件): 在请求发送到网站之前和响应返回给 Spider 之后,对请求和响应进行处理,例如设置 User-Agent、代理、Cookie 等。

  • Spider Middlewares (爬虫中间件): 在 Spider 处理请求和响应的过程中,对请求和响应进行处理,例如重试失败的请求、处理重定向等。

Graph TD 图示 Scrapy 框架数据流:

Scrapy 代码示例:

假设我们要爬取一个博客网站的文章标题和链接。

创建 Scrapy 项目:

scrapy startproject blog_crawler cd blog_crawler scrapy genspider blog blog.example.com

定义 Item (items.py):

import scrapy class BlogCrawlerItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() # ... 其他字段

编写 Spider (spiders/blog.py):

import scrapy from blog_crawler.items import BlogCrawlerItem class BlogSpider(scrapy.Spider): name = 'blog' allowed_domains = ['blog.example.com'] # 替换为目标域名 start_urls = ['http://blog.example.com/'] # 替换为起始 URL def parse(self, response): articles = response.css('article') # 使用 CSS 选择器选择文章元素 for article in articles: item = BlogCrawlerItem() item['title'] = article.css('h2 a::text').get().strip() # 提取标题文本 item['link'] = response.urljoin(article.css('h2 a::attr(href)').get()) # 提取链接并拼接完整 URL yield item # 翻页示例 (如果网站有分页) next_page_url = response.css('nav.pagination a.next::attr(href)').get() if next_page_url: yield response.follow(next_page_url, callback=self.parse) # 递归爬取下一页

配置 Item Pipeline (pipelines.py):

class BlogCrawlerPipeline: def process_item(self, item, spider): # 数据清洗、验证、存储等操作 print(f"Processed Item: {item['title']} - {item['link']}") return item

启用 Pipeline (settings.py):

ITEM_PIPELINES = { 'blog_crawler.pipelines.BlogCrawlerPipeline': 300, # 启用 Pipeline,数字代表优先级 }

运行爬虫:

scrapy crawl blog

代码详解:

  • scrapy startproject blog_crawler: 创建名为 blog_crawler 的 Scrapy 项目。

  • scrapy genspider blog blog.example.com: 创建名为 blog 的 Spider,爬取域名为 blog.example.com 的网站。

  • BlogCrawlerItem: 定义 Item 类,包含 titlelink 字段。

  • BlogSpider: 定义 Spider 类,name 是爬虫名称,allowed_domains 是允许爬取的域名列表,start_urls 是起始 URL 列表。

  • parse(self, response): Spider 的核心解析方法,接收 Downloader 下载的响应对象 response

  • response.css('article'): 使用 CSS 选择器选择 HTML 文档中所有 <article> 元素。

  • article.css('h2 a::text').get().strip(): 在每个 <article> 元素内,使用 CSS 选择器选择 <h2> 标签下的 <a> 标签,提取其文本内容 (::text),使用 .get() 获取第一个匹配结果,.strip() 去除空白字符。

  • response.urljoin(article.css('h2 a::attr(href)').get()): 提取 <a> 标签的 href 属性值 (::attr(href)),使用 response.urljoin() 将相对 URL 转换为绝对 URL。

  • yield item: 使用 yield 关键字返回 Item,Scrapy 会自动将 Item 传递给 Item Pipeline 进行处理。

  • response.follow(next_page_url, callback=self.parse): 构建爬取下一页的请求,callback=self.parse 指定下一页响应的解析方法仍然是 parse 方法,实现递归爬取。

  • BlogCrawlerPipeline.process_item(self, item, spider): Item Pipeline 的处理方法,接收 Spider 产生的 Item 对象,可以进行数据清洗、验证、存储等操作。

Scrapy 框架提供了更高级的功能,例如自动处理 Cookie、Session、代理、User-Agent 轮换、请求调度、并发控制等,可以更高效、稳定地进行大规模数据采集。

3.2.3 爬虫策略与优化

为了高效地采集数据,需要选择合适的爬虫策略并进行优化:

  • 广度优先爬取 (Breadth-First Crawl): 优先爬取同一层级的链接,然后再深入下一层级。适合快速发现网站的所有页面,但可能无法及时获取深层页面的数据。

  • 深度优先爬取 (Depth-First Crawl): 优先沿着链接深入爬取,直到达到预设深度或遇到终止条件。适合快速获取特定主题的数据,但可能遗漏其他分支的页面。

  • 聚焦爬取 (Focused Crawl): 根据预定义的主题或关键词,只爬取与主题相关的页面。适合采集特定领域的数据,提高爬取效率和数据相关性。

  • 增量爬取 (Incremental Crawl): 定期爬取网站,只抓取更新或新增的页面。适合长期维护数据,减少重复爬取和资源消耗。

爬虫优化策略:

  • 使用异步请求库 (如 aiohttp): 提高并发性,加速数据下载。

  • 分布式爬虫: 将爬虫部署到多台机器上,并行爬取,提高爬取规模和速度。

  • 请求去重: 避免重复爬取相同的 URL,减少资源浪费。

  • 设置合理的请求间隔和并发数: 避免对网站服务器造成过大压力,遵守网站的 robots.txt 协议和爬虫规则。

  • 使用缓存: 缓存已下载的页面,减少重复下载,提高效率。

  • 处理动态加载内容 (JavaScript 渲染): 使用 Headless Browser (如 Selenium, Puppeteer, Playwright) 渲染 JavaScript,获取动态生成的内容。

3.2.4 爬虫伦理与法律合规

Crawl4AI 数据采集必须遵守伦理规范和法律法规:

  • 尊重网站的 robots.txt 协议: robots.txt 文件定义了网站允许和禁止爬虫访问的目录和文件,爬虫应该遵守 robots.txt 的规则。

  • 避免对网站服务器造成过大压力: 合理设置请求间隔和并发数,避免过度频繁地请求网站,导致服务器过载甚至崩溃。

  • 保护用户隐私: 避免采集用户的个人敏感信息,例如身份证号、银行卡号、住址、电话号码等。

  • 遵守数据使用协议: 如果网站有明确的数据使用协议,需要遵守协议的规定,例如不得将数据用于商业用途、不得公开数据等。

  • 遵守相关法律法规: 例如,《网络安全法》、《数据安全法》、《个人信息保护法》等,确保数据采集和使用行为合法合规。

违反爬虫伦理和法律法规可能导致网站封禁 IP、法律诉讼等风险。Crawl4AI 项目应始终将合规性放在首位。

3.3 数据处理:从原始数据到可用数据

数据采集只是 Crawl4AI 的第一步,采集到的原始数据往往包含噪声、冗余信息、格式不统一等问题,无法直接用于 AI 模型训练。数据处理的目标是将原始数据清洗、转换、整合,使其成为高质量、结构化、可用的数据集。本节将详细介绍数据处理的关键步骤和技术方法。

3.3.1 数据清洗:去除噪声与冗余

数据清洗是数据处理的首要环节,旨在去除原始数据中的噪声、错误、缺失值和冗余信息,提高数据质量。常见的数据清洗操作包括:

  • 去除重复数据: 网络爬虫可能重复抓取相同的页面或数据记录,需要去除重复数据,避免影响模型训练。可以使用哈希算法、集合或数据库去重。

  • 处理缺失值: 原始数据可能存在缺失值,需要根据具体情况选择合适的处理方法,例如:

    • 删除缺失值: 如果缺失值比例较低,且对数据分析影响不大,可以直接删除包含缺失值的记录。

    • 填充缺失值: 使用统计值(例如均值、中位数、众数)、固定值、模型预测值等填充缺失值。

  • 处理异常值: 原始数据可能存在异常值,例如数值型数据的极端值、文本数据中的乱码字符等。需要识别和处理异常值,避免影响模型训练。可以使用统计方法(例如箱线图、Z-score)、领域知识或机器学习模型检测异常值。

  • 去除无关信息: 原始数据可能包含与 AI 任务无关的信息,例如 HTML 标签、广告、导航栏、版权声明等。需要去除这些无关信息,保留核心数据。可以使用正则表达式、HTML 解析库、文本处理技术等去除无关信息.

  • 文本数据清洗: 对于文本数据,还需要进行更细致的清洗,例如:

    • 去除 HTML 标签和特殊字符: 使用正则表达式或 HTML 解析库去除 HTML 标签和特殊字符。

    • 转换为小写或大写: 统一文本大小写,避免大小写敏感问题。

    • 去除停用词: 去除文本中常见的停用词(例如 "的"、"是"、"在" 等),减少噪声。

    • 词干提取或词形还原: 将单词转换为词干或词根形式,例如将 "running"、"runs"、"ran" 转换为 "run",提高文本数据的泛化能力。

    • 处理标点符号: 根据具体任务需求,选择保留或去除标点符号。

代码示例:使用 Pandas 进行数据清洗

假设我们有一个包含用户评论数据的 CSV 文件 comments.csv,其中可能包含重复评论、缺失评分和异常评论内容。

import pandas as pd # 读取 CSV 文件 df = pd.read_csv('comments.csv') # 1. 去除重复评论 (假设评论内容在 'comment_text' 列) df.drop_duplicates(subset=['comment_text'], inplace=True) # 2. 处理缺失评分 (假设评分在 'rating' 列,缺失值用均值填充) mean_rating = df['rating'].mean() df['rating'].fillna(mean_rating, inplace=True) # 3. 处理异常评论内容 (假设异常评论内容包含特定关键词,例如 "广告") df = df[~df['comment_text'].str.contains('广告')] # 过滤掉包含 "广告" 的评论 # 4. 文本数据清洗 (假设评论内容在 'comment_text' 列) import re import nltk from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer nltk.download('stopwords') nltk.download('wordnet') stop_words = set(stopwords.words('english')) lemmatizer = WordNetLemmatizer() def clean_text(text): text = re.sub(r'<[^>]+>', '', text) # 去除 HTML 标签 text = re.sub(r'[^a-zA-Z\s]', '', text) # 去除标点符号和特殊字符,保留字母和空格 text = text.lower() # 转换为小写 words = text.split() words = [lemmatizer.lemmatize(word) for word in words if word not in stop_words] # 词形还原和去除停用词 return ' '.join(words) df['cleaned_comment_text'] = df['comment_text'].apply(clean_text) # 保存清洗后的数据 df.to_csv('cleaned_comments.csv', index=False) print("数据清洗完成!")

代码详解:

  • pd.read_csv('comments.csv'): 使用 Pandas 读取 CSV 文件到 DataFrame 对象 df

  • df.drop_duplicates(subset=['comment_text'], inplace=True): 使用 drop_duplicates() 方法去除 comment_text 列的重复值,inplace=True 表示直接修改 DataFrame。

  • df['rating'].fillna(mean_rating, inplace=True): 使用 fillna() 方法将 rating 列的缺失值填充为均值 mean_rating

  • df = df[~df['comment_text'].str.contains('广告')]: 使用布尔索引和 str.contains() 方法过滤掉 comment_text 列包含 "广告" 的行。

  • re.sub(r'<[^>]+>', '', text): 使用正则表达式 re.sub() 替换 HTML 标签为空字符串。

  • re.sub(r'[^a-zA-Z\s]', '', text): 使用正则表达式替换非字母和非空格字符为空字符串。

  • text.lower(): 将文本转换为小写。

  • stopwords.words('english'): 获取英文停用词列表。

  • WordNetLemmatizer(): 创建词形还原器对象。

  • lemmatizer.lemmatize(word): 对单词进行词形还原。

  • df['comment_text'].apply(clean_text): 使用 apply() 方法将 clean_text 函数应用于 comment_text 列的每个元素,生成新的清洗后的列 cleaned_comment_text

  • df.to_csv('cleaned_comments.csv', index=False): 将清洗后的 DataFrame 保存为 CSV 文件。

3.3.2 数据转换:结构化与特征工程

数据转换是将清洗后的数据转换为更适合 AI 模型训练的格式和结构。常见的数据转换操作包括:

  • 数据类型转换: 将数据转换为合适的类型,例如将字符串类型的数值转换为数值型,将日期字符串转换为日期类型。

  • 数据标准化/归一化: 将数值型数据缩放到特定范围 (例如 0-1 或 -1-1),消除不同特征之间量纲的影响,提高模型训练效率和精度。常用的标准化方法有 Min-Max 归一化、Z-score 标准化等。

  • 数据编码: 将类别型数据转换为数值型数据,例如:

    • 独热编码 (One-Hot Encoding): 将每个类别转换为一个二进制向量,向量中只有一个元素为 1,其余为 0。适用于类别数量较少的情况。

    • 标签编码 (Label Encoding): 将每个类别转换为一个整数标签。适用于类别之间存在顺序关系的情况。

    • 词嵌入 (Word Embedding): 将文本数据中的词语转换为低维向量表示,例如 Word2Vec、GloVe、FastText 等。适用于 NLP 任务。

  • 特征工程: 根据 AI 任务需求,从原始数据中提取或构造新的特征,提高模型性能。特征工程是一个创造性的过程,需要结合领域知识和数据分析技巧。常见的特征工程方法包括:

    • 数值特征工程: 例如,对数值特征进行分箱、多项式特征扩展、交互特征等。

    • 文本特征工程: 例如,提取文本的词频 (TF-IDF)、N-gram 特征、句法特征、语义特征等。

    • 图像特征工程: 例如,提取图像的颜色直方图、纹理特征、边缘特征、SIFT、SURF 等。

    • 时间序列特征工程: 例如,提取时间序列的统计特征、趋势特征、周期性特征、自相关性特征等。

代码示例:使用 Scikit-learn 进行数据转换和特征工程

假设我们有一个包含用户信息的 DataFrame user_info_df,其中包含年龄、性别、城市和兴趣爱好等特征。

import pandas as pd from sklearn.preprocessing import MinMaxScaler, OneHotEncoder from sklearn.feature_extraction.text import TfidfVectorizer # 假设 user_info_df 包含 'age', 'gender', 'city', 'interests' 列 # 1. 数值特征标准化 (对 'age' 列进行 Min-Max 归一化) scaler = MinMaxScaler() user_info_df['age_scaled'] = scaler.fit_transform(user_info_df[['age']]) # 2. 类别特征独热编码 (对 'gender' 和 'city' 列进行独热编码) encoder = OneHotEncoder(handle_unknown='ignore', sparse_output=False) # sparse_output=False 返回 NumPy 数组 encoded_features = encoder.fit_transform(user_info_df[['gender', 'city']]) encoded_feature_names = encoder.get_feature_names_out(['gender', 'city']) # 获取编码后的特征名 encoded_df = pd.DataFrame(encoded_features, columns=encoded_feature_names) user_info_df = pd.concat([user_info_df, encoded_df], axis=1) # 合并编码后的特征到原 DataFrame # 3. 文本特征 TF-IDF (对 'interests' 列进行 TF-IDF 特征提取) tfidf_vectorizer = TfidfVectorizer(max_features=100) # 限制最大特征数为 100 tfidf_matrix = tfidf_vectorizer.fit_transform(user_info_df['interests']) tfidf_df = pd.DataFrame(tfidf_matrix.toarray(), columns=tfidf_vectorizer.get_feature_names_out(['interests'])) user_info_df = pd.concat([user_info_df, tfidf_df], axis=1) # 合并 TF-IDF 特征到原 DataFrame # 删除原始类别特征列 user_info_df.drop(['gender', 'city', 'interests'], axis=1, inplace=True) print("数据转换和特征工程完成!")

代码详解:

  • MinMaxScaler(): 创建 Min-Max 归一化器对象。

  • scaler.fit_transform(user_info_df[['age']]): 对 age 列进行 Min-Max 归一化,返回归一化后的 NumPy 数组,并赋值给新的列 age_scaled

  • OneHotEncoder(handle_unknown='ignore', sparse_output=False): 创建独热编码器对象,handle_unknown='ignore' 表示忽略未知类别,sparse_output=False 返回 NumPy 数组。

  • encoder.fit_transform(user_info_df[['gender', 'city']]): 对 gendercity 列进行独热编码,返回编码后的 NumPy 数组。

  • encoder.get_feature_names_out(['gender', 'city']): 获取编码后的特征名。

  • pd.DataFrame(encoded_features, columns=encoded_feature_names): 将编码后的 NumPy 数组转换为 DataFrame 对象。

  • pd.concat([user_info_df, encoded_df], axis=1): 将编码后的 DataFrame 与原 DataFrame 按列合并。

  • TfidfVectorizer(max_features=100): 创建 TF-IDF 向量化器对象,max_features=100 限制最大特征数为 100。

  • tfidf_vectorizer.fit_transform(user_info_df['interests']): 对 interests 列进行 TF-IDF 特征提取,返回 TF-IDF 矩阵。

  • tfidf_matrix.toarray(): 将稀疏矩阵转换为稠密 NumPy 数组。

  • tfidf_vectorizer.get_feature_names_out(['interests']): 获取 TF-IDF 特征名。

  • user_info_df.drop(['gender', 'city', 'interests'], axis=1, inplace=True): 删除原始的类别特征列。

3.3.3 数据存储:高效管理与访问

数据存储是数据处理的最后环节,选择合适的存储方案对于数据管理、访问效率和后续模型训练至关重要。常见的数据存储方案包括:

  • 关系型数据库 (RDBMS): 例如 MySQL, PostgreSQL, SQL Server, Oracle 等。适用于存储结构化数据,支持 SQL 查询,易于管理和维护。

  • NoSQL 数据库: 例如 MongoDB, Cassandra, Redis, Elasticsearch 等。适用于存储半结构化或非结构化数据,具有高可扩展性和灵活性,适合大规模数据存储和高并发访问。

  • 文件系统: 例如 CSV 文件、JSON 文件、Parquet 文件、HDF5 文件等。适用于存储中小规模数据,简单易用,但数据管理和查询效率较低。

  • 云存储: 例如 Amazon S3, Google Cloud Storage, Azure Blob Storage 等。适用于存储大规模数据,具有高可靠性、高可扩展性和低成本,方便云端数据处理和模型训练。

数据存储方案选择建议:

  • 结构化数据 (例如表格数据): 优先选择关系型数据库或 Parquet 文件。

  • 半结构化数据 (例如 JSON 文档): 可以选择 NoSQL 数据库 (例如 MongoDB) 或 JSON 文件。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U