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内存溢出,可以把资源调大点,分区数结合实际数据大小资源调整
spark = SparkSession.Builder()\
    .master("local[*]")\
    .config("spark.sql.shuffle.partitions",24)\
    .config("spark.executor.cores",8)\
    .config("spark.executor.memory","16g")\
    .config("spark.executor.instances",1)\
    .config("spark.driver.memory","4g")\
    .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%;(包括其他系统软件占用),数据读取计算只花了9秒
在这里插入图片描述

查看pandas计算时间:

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

在这里插入图片描述
结论:

小数据量通常我们使用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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pandaspyspark都是用于数据操作和分析的库,但它们有一些区别。 pandas是一个在Python中广泛使用的库,用于数据操作和分析。它提供了一个称为DataFrame的数据结构,可以方便地进行数据处理和分析。你可以使用pandas读取和写入各种数据格式,如CSV、Excel、SQL数据库等。下面是一个使用pandas读取CSV文件并创建DataFrame的示例代码: ```python import pandas as pd df = pd.read_csv('data.csv') ``` pyspark是一个用于大规模数据处理的开源框架,它基于Apache Spark。它提供了一个称为DataFrame的分布式数据集,可以处理大规模数据并进行分布式计算。你可以使用pyspark读取和写入各种数据格式,如CSV、Parquet、Hive等。下面是一个使用pyspark读取CSV文件并创建DataFrame的示例代码: ```python from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() df = spark.read.csv('data.csv', header=True, inferSchema=True) ``` 要将pandas的DataFrame转换为pyspark的DataFrame,你可以使用`createDataFrame`方法: ```python from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() pandas_df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']}) df = spark.createDataFrame(pandas_df) ``` 要将pyspark的DataFrame转换为pandas的DataFrame,你可以使用`toPandas`方法: ```python pandas_df = df.toPandas() ``` 总结一下,pandas适用于小规模数据处理和分析,而pyspark适用于大规模数据处理和分布式计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值