我有一个使用Spark 1.3.1,Amazon S3和EMR 3.8的ETL应用程序。 我需要我的应用程序将Dataframe保存在多个分区中。
根据Spark 1.3.1文档,这是分区镶木地板文件的方法:
df1.save("data/test_table/key=1", "parquet")
但问题是我的RDD有很多数据,需要保存在不同的分区上。 (在小组中)
我找不到一个正确的逻辑,让这个程序快速运行(或不是那么慢)
一些尝试:
#Get All RDD Partition's
AllPartitions = RDD.map(lambda x: x[0]).distinct()
#For all partitions save filtering
for part in AllPartitions.collect():
filteredDF = df.filter(df.recordOpeningDate == part)
df.save(path=outputFilePath + "/FIELD=" + part, source='parquet',mode='append')
尝试使用 GroupBy
def Mapping(line):
return (
line[0] , [
#Definition of my RDD
])
def SavePartitions(KV):
#WRONG ! I cant create a DF inside a transformation
df = sqlContext.createDataFrame(KV, SCHEMA)
df.save(...)
RDD = RDD.map(Mapping).groupByKey().mapValues(SavePartitions)
答案 0 :(得分:0)
也许我误解了您的问题,但如果您有dataframe
,则可以致电repartition
将您的数据拆分为所需数量的分区,例如10:
myDataFrame.repartition(10).saveAsParquet("/path/to/output/")
这将导致您的数据存储在/ path / to / output /下的10个不同文件中。
答案 1 :(得分:0)
有关信息,
我的解决方案是使用方法pyspark.sql.DataFrameWriter.save更新我的EMR 4.0集群(使用Spark 1.4.1)。