#apache-spark #pyspark #apache-spark-sql
Вопрос:
Сколько разделов 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 МБ на диске. Я запускаю 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 разделов независимо от размера файла?
Ответ №1:
Фактическая формула на самом деле немного сложнее. Проверьте приведенный ниже расчет. Вы можете найти исходный код здесь.
Это ваша конфигурация и ваш файл
Конфигурация Spark | Значение | По умолчанию |
---|---|---|
spark.sql.files.maxPartitionBytes | 128 МБ | 128 МБ |
spark.sql.files.openCostInBytes | 4M | 4M |
spark.executor.instances | 1 | Местные новости |
spark.executor.cores | 8 | ваши ядра |
spark.default.parallelism | 8 | =spark.executor.instances * spark.executor.cores |
размер файлов данных | 64M | |
количество файлов данных | 1 |
Это фактическая формула
Формула | Байты | |
---|---|---|
DefaultMaxSplitBytes | = spark.sql.files.maxPartitionBytes | 134,217,728 |
OpenCostInBytes | = spark.sql.files.openCostInBytes | 4,194,304 |
DefaultПараллелизм | = spark.default.parallelism | 8 |
Всего байтов | = Байты данных (# files * OpenCostInBytes) | 71,303,168 |
BytesPerCore | = TotalBytes / DefaultПараллелизм | 8,912,896 |
MaxSplitBytes | = MIN(DefaultMaxSplitBytes, MAX(OpenCostInBytes, BytesPerCore)) | 8,912,896 |
Предполагаемое количество разделов | = TotalBytes / MaxSplitBytes | 8 |