【Spark】spark dataframe与pandas dataframe转换

1、spark 转 pandas

pandas dataframe = spark dataframe.toPandas()

注意事项

toPandas()因为是单机处理数据,所以不能处理大量数据。

toPandas 返回的数据归根结底还是缓存在 driver 的内存中的,不建议返回过大的数据。

在spark dataFrame 中使用 pandas dataframe_偷闲小苑-CSDN博客

 pandas dataFrame 无法支持大量数据的计算,可以尝试 spark df 来解决这个问题。

原生toPandas()

df.toPandas()

分布式toPandas()

pd_df = toPandas(sp_df)

优化代码如下:

import pandas as pd
def _map_to_pandas(rdds):
    return [pd.DataFrame(list(rdds))]
    
def toPandas(df, n_partitions=None):
    if n_partitions is not None: df = df.repartition(n_partitions)
    df_pand = df.rdd.mapPartitions(_map_to_pandas).collect()
    df_pand = pd.concat(df_pand)
    df_pand.columns = df.columns
    return df_pand

# 98列,22W行,类型 array/string/Long/Int,分区 200
df = spark.sql("...").sample(False,0.002)

df.cache()
df.count()

# 原生的 toPandas 方法
%timeit df.toPandas()

# 分布式的 toPandas
%timeit toPandas(df)

#使用 apache arrow,spark 版本2.3以上
spark.sql("set spark.sql.execution.arrow.enabled=true")
%timeit df.toPandas()

tips: 如果一个分区数据量过大将会导致 executor oom。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值