Parquet使用指南:一个超越CSV、提升数据处理效率的存储格式

在这里插入图片描述

前言

在大数据时代,数据存储和处理的效率越来越重要。同时,我们在工作中处理的数据也越来越多,从excel格式到csv格式,从文件文档传输到直接从数据库提取,数据单位也从K到M再到G。

当数据量达到了G以上,几G甚至几十G,在使用python时就能察觉到数据处理效率在变慢。在这种情况下有什么更好的解决方法吗?

什么是Parquet?

Parquet是一种开源的列式存储数据文件格式,旨在高效存储和检索数据。它提供了高效的数据压缩和编码方案,能够处理大量复杂数据。同时,支持多种编程语言。Parquet被设计为批处理和交互工作负载的通用交换格式,类似于Hadoop中的其他列式存储格式,如RCFile和ORC。

Parquet与CSV的比较

与简单的CSV格式相比,Parquet在存储和处理大数据集时具有明显优势:

  • 存储效率:Parquet在云存储上的需求比CSV小得多。
  • 查询性能:Parquet的查询速度远高于CSV,特别是在处理大数据时。
  • 成本节约:使用Parquet可以大幅降低存储和数据扫描成本。
数据集Amazon S3大小查询时间数据扫描量成本
CSV格式数据1 TB236秒1.15 TB$5.75
Parquet格式数据130 GB6.78秒2.51 GB$0.01
节省87%34倍更快99%99.7%

Parquet的优势

  • 适用于各种大数据存储:适用于存储各种类型的大数据(结构化数据表、图像、视频、文档)。
  • 节省云存储空间:通过高效的列式压缩和灵活的编码方案,显著节省云存储空间。
  • 提高数据吞吐量和性能:使用数据跳过等技术,只读取需要的列,减少I/O,提升查询性能。
  • 优化复杂数据处理:支持复杂数据结构,适合处理大批量数据,提供高效的数据压缩和编码。

列式存储的优势

  • 查询效率:与行式存储(如CSV)相比,列式存储可以快速跳过无关数据,显著减少聚合查询时间。
  • 压缩效率:列式存储支持灵活的压缩选项和高效编码方案,使查询更快,数据压缩更高效。不同的数据文件可以以不同的方式压缩。
  • 支持复杂查询:Apache Parquet是从底层构建的,支持高级嵌套数据结构,优化大型数据处理,特别是处理GB级别数据文件的查询。
  • 兼容多种技术:适用于AWS Athena、Amazon Redshift Spectrum、Google BigQuery等交互和无服务器技术。

应用场景

  1. 大数据处理:Parquet格式在大数据处理和分析场景中非常流行,特别是在使用Apache Spark和Hadoop等工具时。
  2. 数据仓库:由于其高效的存储和读取性能,Parquet常用于数据仓库中,以支持快速的查询和分析。
  3. 数据传输和存储:Parquet格式非常适合用作长期数据存储格式,同时也便于在不同系统之间传输。

Parquet用法介绍

安装必要的库

首先,需要安装Pandas和PyArrow库。如果尚未安装,可以使用以下命令安装:

pip install pandas
pip install pyarrow

创建和读取Parquet文件(df转Parquet)

以下是一个简单的示例,把一个Dataframe写入Parquet文件中:

import pandas as pd

# 创建数据
data = {
    'A': [1, 2, 3, 4, 5],
    'B': ['a', 'b', 'c', 'd', 'e'],
    'C': [1.1, 2.2, 3.3, 4.4, 5.5]
}
df = pd.DataFrame(data)

# 写入parquet文件
df.to_parquet('data.parquet', engine='pyarrow')

此时会生成一个名为data.parquet的文件。

# 读取parquet文件
df = pd.read_parquet('data.parquet', engine='pyarrow')

# 打印前五行数据
print(df.head())

读取CSV并转换为Parquet

以下是一个简单的示例代码,演示如何将CSV文件转换为Parquet格式:

import pandas as pd

# 读取CSV文件
csv_file_path = 'data.csv'
df = pd.read_csv(csv_file_path)

# 将数据写入Parquet格式
parquet_file_path = 'data.parquet'
df.to_parquet(parquet_file_path, engine='pyarrow')

在上述代码中,我们首先使用pd.read_csv函数读取CSV文件,然后使用df.to_parquet函数将DataFrame保存为Parquet格式文件。

将大型CSV文件转换成Parquet格式

这个脚本的工作流程如下:

  1. 使用 pandas.read_csv 逐块读取CSV文件,块大小由 chunksize 参数决定。
  2. 将每块数据转换为Apache Arrow的Table。
  3. 使用 ParquetWriter 将每块数据写入Parquet文件。
import pandas as pd 
import pyarrow as pa 
import pyarrow.parquet as pq

# 定义读取CSV文件的块大小
chunksize = 10**6  # 每次读取100万行

csv_file = 'data.csv'
parquet_file = 'large_file.parquet'

# 使用pandas逐块读取CSV文件
reader = pd.read_csv(csv_file, chunksize=chunksize)

# 读取第一块数据以确定schema
first_chunk = next(reader)
table = pa.Table.from_pandas(first_chunk)

# 打开一个新的Parquet文件以写入,并设置schema
with pq.ParquetWriter(parquet_file, table.schema) as writer:
    writer.write_table(table)
    
    # 继续处理剩余的块
    for i, chunk in enumerate(reader, start=1):
        print(f'Processing chunk {i}...')
        table = pa.Table.from_pandas(chunk)
        writer.write_table(table)

print('CSV to Parquet conversion completed.')

注意:根据具体情况调整 chunksize 的大小,以平衡内存使用和I/O性能。

总结

通过使用Pandas和PyArrow等库,可以方便地将CSV文件转换为Parquet格式,并读取Parquet文件以进行数据操作。特别是在大规模数据分析和存储的应用中,了解和使用Parquet格式可以显著提高数据处理的效率和性能。

参考链接

  • What is Parquet?
  • pyarrow · PyPI
  • Installing PyArrow — Apache Arrow v16.1.0

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/661315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

串口通信问题排查总结

串口通信问题排查 排查原则: 软件从发送处理到接收处理,核查驱动、控制及发送接收数据是否正常。硬件从发送到接收,针对信号经过的各段,分段核对信号是否正常。示波器、逻辑分析仪。用万用表、示波器、逻辑分析仪等工具&#xf…

Hadoop3:MapReduce之简介、WordCount案例源码阅读、简单功能开发

一、概念 MapReduce是一个 分布式运算程序 的编程框架,是用户开发“基于 Hadoop的数据分析 应用”的核心框架。 MapReduce核心功能是将 用户编写的业务逻辑代码 和 自带默认组件 整合成一个完整的 分布式运算程序 ,并发运行在一个 Hadoop集群上。 1、M…

【高频】redis快的原因

相关问题: 1.为什么Redis能够如此快速地进行数据存储和检索? 2.Redis作为内存数据库,其内存存储有什么优势吗? 3.Redis的网络模型有何特点,如何帮助提升性能? 一、问题回答 Redis使用了内存数据结构,例如字符串、哈希表、列表、集合、有…

pycharm中,出现SyntaxError: Non-ASCII character ‘\xe4‘ in file... 的问题以及解决方法

文章目录 一、问题描述二、解决方法 一、问题描述 在pycharm中,使用python中编写中文字符时,会提示如下错误信息: SyntaxError: Non-ASCII character \xe4 in file ...... on line 8, but no encoding declared; see http://python.org/dev…

TypeScript-初识

TypeScript 是具有类型语法的JavaScript&#xff0c;是一门强类型的编程语言 变量不能做随意类型赋值 好处&#xff1a; 1️⃣ 静态类型检查&#xff0c;提前发现代码错误 function arrToStr(arr: Array<string>){return arr.join() } arrToStr(123) // 类型“stri…

网页版应用授权的核心难点

Web应用的出现 随着数字化时代发展&#xff0c;越来越多的企业开始关注工业软件上云。这种趋势不仅满足了企业对于提高生产效率、降低运维成本的需求&#xff0c;还帮助企业更好地应对市场竞争、实现产业升级和智能制造。 在软件上云的过程中&#xff0c;会产生新产品形态和新…

2024 京麟ctf -MazeCodeV1

文章目录 检查代码思路一个字节的指令注意附上S1uM4i佬们的exp https://www.ctfiot.com/184181.html 检查 代码 __int64 __fastcall check_solve(char *a1) {__int64 result; // rax__int64 v2; // rax__int64 index_step; // rax__int64 v4; // rax__int64 v5; // rax__int64…

贪心(临项交换)+01背包,蓝桥云课 搬砖

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0搬砖 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 将物品按照w[i] v[i]升序排序然后跑01背包就是答案 下面证明&#xff1a;&#xff08;不要问怎么想到的&#xff0c;做题多了就能想到&#xff…

一致性hash算法原理图和负载均衡原理-urlhash与least_conn案例

一. 一致性hash算法原理图 4台服务器计算hash值图解 减少一台服务3台服务器计算hash值图解 增加一台服务器5台服务器计算hash值图解 二. 负载均衡原理-urlhash与least_conn 2.1.urlhash案例 # urlhash upstream tomcats {hash $requ

5分钟教你APP变现,让商业浪潮为你助力!

在这个数字时代&#xff0c;几乎每个人都有一个或多个应用程序&#xff08;APP&#xff09;的想法&#xff0c;它们可能是为了解决特定问题&#xff0c;提供娱乐或简化日常任务。然而&#xff0c;许多开发者面临的最大挑战之一是如何将这些创意转化为盈利的商业模式。本文将探讨…

idea+tomcat+mysql 从零开始部署Javaweb项目(保姆级别)

文章目录 新建一个项目添加web支持配置tomcat优化tomcat的部署运行tomcatidea数据库连接java连接数据库 新建一个项目 new project&#xff1b;Java&#xff1b;选择jdk的版本&#xff1b;next&#xff1b;next&#xff1b;填写项目名字&#xff0c;选择保存的路径&#xff1b;…

基于GO 写的一款 GUI 工具,M3u8视频下载播放器-飞鸟视频助手

M3u8视频下载播放器-飞鸟视频助手 M3u8视频飞鸟视频助手使用m3u8下载m3u8 本地播放 软件下载地址m3u8嗅探 M3u8视频 M3u8视频格式是为网络视频播放设计&#xff0c;视频网站多数采用 m3u8格式。如腾讯&#xff0c;爱奇艺等网站。 m3u8和 mp4的区别&#xff1a; 一个 mp4是一个…

HTTP Basic Access Authentication Schema

HTTP Basic Access Authentication Schema 背景介绍流程安全缺陷参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得&#xff0c;并非原创&#xff0c;目的是为了需要时方便查看。 介绍 HTTP Basic Access Authentication Schema&#xff0c;HTTP 基本访问认证模式…

JavaScript-JavaWeb

目录 什么是JavaScript? js引入方式 js基础语法 书写语法 变量 数据据类型 运算符 类型转换 流程语句 js函数 js对象 1.Array 2.String 3.JSON js事件监听 什么是JavaScript? ● JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能…

【busybox记录】【shell指令】readlink

目录 内容来源&#xff1a; 【GUN】【readlink】指令介绍 【busybox】【readlink】指令介绍 【linux】【readlink】指令介绍 使用示例&#xff1a; 打印符号链接或规范文件名的值 - 默认输出 打印符号链接或规范文件名的值 - 打印规范文件的全路径 打印符号链接或规范文…

英语学习笔记29——Come in, Amy!

Come in, Amy! 进来&#xff0c;艾米&#xff01; shut v. 关严 区别&#xff1a;shut the door 把门关紧 口语&#xff1a;Shut up! 闭嘴&#xff01;    态度强硬&#xff0c;不礼貌 例句&#xff1a;请不要把门关严。    Don’t shut the door, please. bedroom n. …

内存函数<C语言>

前言 前面两篇文章介绍了字符串函数&#xff0c;不过它们都只能用来处理字符串&#xff0c;C语言中也内置了一些内存函数来对不同类型的数据进行处理&#xff0c;本文将介绍&#xff1a;memcpy()使用以及模拟实现&#xff0c;memmove()使用以及模拟实现&#xff0c;memset()使用…

关于微信小程序低功耗蓝牙ECharts实时刷新(涉及自定义缓冲区)

简单的蓝牙显示&#xff08;串口手动发数据测试&#xff09; 最近搞了这方面的东西&#xff0c;是刚刚开始接触微信小程序&#xff0c;因为是刚刚开始接触蓝牙设备&#xff0c;所以这篇文章适合既不熟悉小程序&#xff0c;又不熟悉蓝牙的新手看。 项目要求是获取到蓝牙传输过来…

A 股涨停板实时数据 API 数据接口

A 股涨停板实时数据 API 数据接口 股票 / A股 / 涨停数据&#xff0c;所有A股涨停板实时数据&#xff0c;A 股涨停数据 / 实时数据。 1. 产品功能 支持所有 A 股涨停板实时数据查询&#xff1b;包含 A 股实时交易多项指标数据&#xff1b;毫秒级查询性能&#xff1b;全接口支…

继电器的选型和英应用

如何保证信号的稳定&#xff1f; 怎么消除继电器触点的电弧&#xff1f; 危害&#xff1a; 继电器的触点在动作时容易产生电弧&#xff0c;电弧具有热效应容易导致触点烧蚀粘接&#xff0c;缩短继电器的寿命&#xff0c;并且产生电弧的过程中会对外进行电磁辐射&#xff0c;…