【发布时间】:2021-05-02 09:47:36
【问题描述】:
我有一个大型数据集,需要使用 pyspark 从 csv 转换为 parquet 格式。大约有 500GB 的数据分散在数千个 csv 文件中。我最初的实现很简单......
spark = SparkSession.builder \
.master("local") \
.appName("test") \
.getOrCreate()
df = spark.read.csv(input_files, header=True, inferSchema=True)
df.repartition(1).write.mode('overwrite').parquet(output_dir)
性能太差了,我已经让它运行了 2 个多小时才放弃。从日志输出我推断它甚至没有完成将 csv 文件读入数据帧。
我在具有 128 个高性能 CPU 内核和 1TB 内存的服务器上本地运行 spark。磁盘存储基于 SSD,已确认读取速度为 650 MB/s。我的直觉是,考虑到可用的计算资源,我应该能够显着提高性能。我正在寻找有关如何执行此操作的提示。
我试过了……
-
不推断架构,这并没有产生明显的性能差异(架构是四列文本)
-
使用配置设置
spark.executor.cores来匹配我服务器上的物理内核数。设置似乎没有任何效果,我没有观察到使用更多内核的系统。
根据管理方向,我暂时无法使用 pyspark,但如有必要,我可以说服他们使用不同的工具。
【问题讨论】:
-
您确定要一个没有任何分区的 Parquet 文件吗?具有分区列应该会加快速度,不仅在写入方面,而且在未来读取和执行计算方面。
-
@mck 我已经考虑过,确定最佳分区数的最佳方法是什么?
-
这是一个非常广泛的问题——谷歌会给你很多答案。这真的取决于你的数据结构。
-
还提供架构 - 手动或按名称读取一个 CSV 文件,并使用
inferSchema读取它,然后使用该文件中的架构读取所有文件
标签: performance csv pyspark parquet