从 Pandas 数据帧到 Spark 数据帧的转换需要大量时间

Posted

技术标签:

【中文标题】从 Pandas 数据帧到 Spark 数据帧的转换需要大量时间【英文标题】:Conversion from Pandas data frame to Spark data frame takes huge amount of time 【发布时间】:2021-03-02 07:26:38 【问题描述】:

我使用 48 核远程机器,但是对于大小为 (1009224, 232) 的 pandas 数据帧,如下所示的操作需要大量时间。实际上,我看不到 spark 的 web GUI 上的运行阶段。有什么想法或建议吗? [更新] 我的主要问题是我无法实现使用 48 核机器的所有可用内核。我想我的配置是错误的。此代码已执行但不在 48 核中。

from pyspark.sql import SparkSession

spark_session = SparkSession.builder.appName("rocket3") \
    .config('spark.driver.memory', '30g')\
    .config('spark.executor.memory', '30g')\
    .config('spark.executor.cores', '40') \
    .config('spark.cores.max', '40') \
    .getOrCreate()

import time

start = time.time()
df_sp = spark_session.createDataFrame(x_df)
end = time.time()
print(end - start)

【问题讨论】:

【参考方案1】:

使用此代码 sn-p 进行转换。

dataset = pd.read_csv("data/file.csv")
sc = SparkContext(conf=conf)
sqlCtx = SQLContext(sc)
sdf = sqlCtx.createDataFrame(dataset)

如果您收到此错误

TypeError: Can not merge type <class 'pyspark.sql.types.StringType'> and <class 'pyspark.sql.types.DoubleType'>

然后将列的数据类型改为str

例如

df[['SomeCol', 'Col2']] = df[['SomeCol', 'Col2']].astype(str)

【讨论】:

感谢您的回答,我更新了问题。实际上,我的脚本运行没有错误。但是我不能使用机器中所有可用的内核。 这是用 python 实现 spark 的东西,顺便说一下在 Scala 实现中你不会面对核心利用率 或者可能是因为对 sc.parallelize 的调用将所有数据放入一个单独的分区中。您可以将分区数指定为并行化的第二个参数

以上是关于从 Pandas 数据帧到 Spark 数据帧的转换需要大量时间的主要内容,如果未能解决你的问题,请参考以下文章

加快从 pandas 数据帧到 mysql 的数据插入

从 pandas 数据帧到多维 numpy 数组以与 tensorflow 兼容

将 Pandas 数据帧转换为 Spark 数据帧的 TypeError

在 Pyspark 中将 Pandas 数据帧转换为 Spark 数据帧的 TypeError

将列表写入 pandas 数据帧到 csv,从 csv 读取数据帧并再次转换为列表而无需字符串

Pandas:确定从唯一行到原始数据帧的映射