pandas与pyspark计算效率对比分析

 更新时间:2023年06月16日 09:39:08   作者:一个散步者的梦  
这篇文章主要介绍了pandas与pyspark计算效率对比,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

日常工作中,主要还是应用HQL和SparkSQL,数据量大,分布式计算很快;

本地数据处理,一般会使用python的pandas包,api丰富,写法比较简单,但只能利用单核性能跑数,数据量大可能会比较慢;spark可以利用多核性能;

单机上,这里尝试构造一个大数据集分别对pandas和sparksql进行跑批测试:

# 数据集构造
import pandas as pd
import numpy as np 
import pyarrow
import sys
import time
from pyspark.sql import SparkSession
df = pd.DataFrame(columns=['id','sales'])
df['id']= np.random.randint(1,10,800000000)    
df['sales']= np.random.randint(30,1000,800000000)   # 生成8亿数据
df = df.append(df)   # 数据量膨胀一倍
df.to_parquet('parquet_test')    # 写入本地文件
print(sys.getsizeof(df) / 1024 / 1024 / 1024)  # 总数据占用内存:23个g

定义pandas计算函数

pandas的read函数会将数据一次读入内存,本地机器资源不够可能会有内存溢出,这时候要考虑逐块读取,分别对每块进行聚合,再进行累聚合;

def pandas_duration():
    start = time.time()
    # df.to_csv('data.txt',index=False,sep=',')
    df = pd.read_parquet('parquet_test')
    mid_time = time.time()
    print('pandas读取数据用时:{:.2f}'.format(mid_time-start))
    print(df.groupby('id',as_index=False).max())   # 分组求最大值
    end = time.time()
    print(end-start)

定义pyspark读取计算函数

# 防止driver内存溢出,可以把资源调大点,笔者电脑64个g就随意填了个32g,分区数结合实际数据大小资源调整
spark = SparkSession.Builder()\
    .master("local[*]")\
    .config("spark.sql.shuffle.partitions",24)\
    .config("spark.driver.memory","32g")\
    .config("spark.driver.maxResultSize","32g")\
    .appName('pyspark')\
    .getOrCreate()
def pyspark_duration():
    start = time.time()
    # df.to_csv('data.txt',index=False,sep=',')
    spark_df = spark.read.parquet('parquet_test')
    mid_time = time.time()
    print('spark读取数据用时:{:.2f}'.format(mid_time-start))
    spark_df.groupBy('id').agg({"sales":"max"}).show()  # 分组求最大值
    end = time.time()
    print(end-start)

查看spark计算时间:

在整个运行过程中,电脑最大内存使用14%;(包括其他系统软件占用),数据读取计算只花了32秒

查看pandas计算时间:

计算巅峰时刻内存在80-90%跳动,差点把我机器干爆了,计算耗时105秒,远大于spark处理32秒

结论:

小数据量通常我们使用pandas处理会更快;对于大量数据,即使是单机,充分利用多核性能,我们使用spark读取往往会有更好的表现,不用定义分块读取聚合,计算更快,内存使用表现更好;

数据处理&优化技巧相关,感兴趣的同学可以点击下面链接:

SparkSQL优化:https://blog.csdn.net/me_to_007/article/details/130916946

hive优化: https://blog.csdn.net/me_to_007/article/details/126921955

pandas数据处理详解:https://blog.csdn.net/me_to_007/article/details/90141769

到此这篇关于pandas与pyspark计算效率对比的文章就介绍到这了,更多相关pandas与pyspark内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 学懂Python字符编码避免乱码陷阱

    学懂Python字符编码避免乱码陷阱

    在Python编程中,处理字符编码和乱码问题是一个常见的挑战,特别是在处理文本数据、文件输入/输出和网络通信时,可能会遇到各种字符编码问题,本文章将深入探讨Python中的乱码问题,解释其原理,并提供解决办法,以确保你的应用程序能够正确处理各种编码情况
    2023-12-12
  • Python记录numpy.empty()函数引发的问题及解决

    Python记录numpy.empty()函数引发的问题及解决

    这篇文章主要介绍了Python记录numpy.empty()函数引发的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • matplotlib交互式数据光标实现(mplcursors)

    matplotlib交互式数据光标实现(mplcursors)

    这篇文章主要介绍了matplotlib交互式数据光标实现(mplcursors),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python构建区块链的方法详解

    Python构建区块链的方法详解

    区块链(Blockchain)是一种分布式账本(listributed ledger),它是一种仅供增加(append-only),内容不可变(immutable)的有序(ordered)链式数据结构,该数据结构由网络中的一系列节点共同维护,并且这些节点之间互不信任
    2023-02-02
  • python如何获取apk的packagename和activity

    python如何获取apk的packagename和activity

    这篇文章主要介绍了python如何获取apk的packagename和activity,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • python指定路径斜杠与反斜杠遇到的问题

    python指定路径斜杠与反斜杠遇到的问题

    这篇文章主要介绍了python指定路径斜杠与反斜杠遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 详解利用python+opencv识别图片中的圆形(霍夫变换)

    详解利用python+opencv识别图片中的圆形(霍夫变换)

    这篇文章主要介绍了详解利用python+opencv识别图片中的圆形(霍夫变换),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python对csv文件追加写入列的方法

    python对csv文件追加写入列的方法

    这篇文章主要介绍了python对csv文件追加写入列,需要的朋友可以参考下
    2019-08-08
  • Python中的并发编程asyncio库入门使用

    Python中的并发编程asyncio库入门使用

    这篇文章主要为大家介绍了Python中的并发编程asyncio库入门的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Python制作运行进度条的实现效果(代码运行不无聊)

    Python制作运行进度条的实现效果(代码运行不无聊)

    这篇文章主要介绍了Python制作运行进度条的实现效果(代码运行不无聊),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02

最新评论