Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么Apache Spark分区会根据文件大小进行CSV读取,以及如何更改分区?_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 为什么Apache Spark分区会根据文件大小进行CSV读取,以及如何更改分区?

Apache spark 为什么Apache Spark分区会根据文件大小进行CSV读取,以及如何更改分区?,apache-spark,pyspark,Apache Spark,Pyspark,这是我的Pypark代码: csv_file = "/FileStore/tables/mnt/training/departuredelays02.csv" schema = "`date` STRING, `delay` INT, `distance` INT, `origin` STRING, `destination` STRING" df = (spark .read .format("csv")

这是我的Pypark代码:

csv_file = "/FileStore/tables/mnt/training/departuredelays02.csv"
schema   = "`date` STRING, `delay` INT, `distance` INT, `origin` STRING, `destination` STRING"
df = (spark
     .read
     .format("csv")                    
     .option("header","true")
     .schema(schema)
     .load(csv_file)                  
        )
partitions = df.rdd.getNumPartitions()
print(partitions)
csv文件有487178行

打印分区后,得到的结果是3个分区

请注意,我有2个工人,4个核心。这意味着总共有8个插槽

现在,如果我尝试加载以下文件,该文件更大,有1391578行:

csv_file = "/FileStore/tables/mnt/training/departuredelays.csv"
我得到一个8的分区

我的问题是如何强制第一个CSV以与较大文件相同的方式进行分区。 我知道可以使用重新分区,但我很想知道这是否可以在没有任何洗牌的情况下完成?即使我们重新划分它,它似乎创建了一个包含3个任务而不是8个任务的作业

以下是我运行以下代码段后得到的结果:

df = df.repartition(8)
print(df.count())
第一个任务的第一阶段仍分配了3个任务

输出:

(3) Spark Jobs
Job 93 View(Stages: 1/1)
Stage 123: 3/3
Job 94 View(Stages: 1/1, 1 skipped)
Stage 124: 0/3 skipped
Stage 125: 8/8
Job 95 View(Stages: 1/1, 2 skipped)
Stage 126: 0/3 skipped
Stage 127: 0/8 skipped
Stage 128: 1/1
您可以尝试使用coalesce,它可以进行合理的洗牌,而不是重新分区

df = spark
     .read
     .format("csv")                    
     .option("header","true")
     .schema(schema)
     .load(csv_file)                  
     .coalesce(8)
查看此以了解更多信息

谢谢您的回复,Mani!。。。我想我对我的问题不是很清楚…虽然合并将有助于避免混乱,但我在这里的主要目标是理解为什么Spark为一个小文件的CSV读入创建了3个任务,为一个大文件创建了8个任务?…还想知道我是否可以强制用8个任务读取小文件?…如果我将同一个小CSV文件拆分为8个文件,Spark自动使用8个任务。它对1391578行单CSV文件也是如此。Stackoverflow中的很多答案都是针对RDD.textfile而不是Dataframe CSV加载的。