【发布时间】:2016-11-22 16:51:15
【问题描述】:
我很困惑为什么在将生成的 RDD 转换为 DataFrame 时,Spark 似乎为rdd.mapPartitions 使用了 1 个任务。
这对我来说是个问题,因为我想从:
DataFrame --> RDD --> rdd.mapPartitions --> DataFrame
这样我就可以读取数据(DataFrame),将非 SQL 函数应用于数据块(RDD 上的 mapPartitions),然后转换回 DataFrame,以便我可以使用DataFrame.write 进程。
我可以从 DataFrame --> mapPartitions 开始,然后使用像 saveAsTextFile 这样的 RDD 编写器,但这并不理想,因为 DataFrame.write 进程可以执行诸如覆盖和保存 Orc 格式的数据之类的操作。所以我想了解为什么会发生这种情况,但从实用的角度来看,我主要关心的是能够从 DataFrame --> mapParitions --> 到使用 DataFrame .write 进程。
这是一个可重现的示例。以下工作按预期工作,mapPartitions 工作有 100 个任务:
from pyspark.sql import SparkSession
import pandas as pd
spark = SparkSession \
.builder \
.master("yarn-client") \
.enableHiveSupport() \
.getOrCreate()
sc = spark.sparkContext
df = pd.DataFrame({'var1':range(100000),'var2': [x-1000 for x in range(100000)]})
spark_df = spark.createDataFrame(df).repartition(100)
def f(part):
return [(1,2)]
spark_df.rdd.mapPartitions(f).collect()
但是,如果最后一行更改为 spark_df.rdd.mapPartitions(f).toDF().show() 之类的内容,那么 mapPartitions 工作将只有一项任务。
【问题讨论】:
标签: python apache-spark pyspark apache-spark-sql