pyspark-sql在读取。csv文件时会创建多少分区?
我的理解是number of partitions = math.ceil(file_size/spark.conf.get('spark.sql.files.maxPartitionBytes'))
在我的机器上:
spark.conf.get('spark.sql.files.maxPartitionBytes')
output:
'134217728b' #128MBs
然而,我没有观察到这种行为。我在磁盘上创建了一个占用96 MB的文件。我在本地模式下运行spark。我有一台8核笔记本电脑。我认为它应该在1个分区中读取。但是,该文件是在8个分区中读取的。下面是我使用的代码库:
import pandas as pd
import numpy as np
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
#creating a small DataFrame. This will occupy 96 MBs on disk
pd.DataFrame({'id':np.arange(10000000),'b':np.random.choice(['a','b','c','d'],size=(10000000,),p=[0.25,0.25,0.25,0.25])}).to_csv('df_s.csv',index=None)
sd=spark.read.csv('df_s.csv',schema="id int, b string")
sd.rdd.getNumPartitions()
output: 8
你能帮我理解为什么我看到8分区不管文件大小?
实际的公式实际上比这更复杂一些。检查下面的计算。你可以在这里找到源代码。
这是你的配置和文件
Spark配置 | 值 | 默认值 | spark.sql.files.maxPartitionBytes | 128 | 128 |
---|---|---|
spark.sql.files.openCostInBytes | 4 m | 4 m |
spark.executor.instances | 1 | 本地 |
spark.executor。8芯 | 你核心 | |
spark.default.parallelism | 8 | =spark.executor.instances * spark.executor.cores |
数据文件大小 | 64 | |
数据文件数 | 1 |