Spark 1.3.1 - Parquet - 发现保存时的多个分区

时间:2015-09-02 15:39:31

标签: python amazon-s3 apache-spark emr parquet

我有一个使用Spark 1.3.1,Amazon S3和EMR 3.8的ETL应用程序。 我需要我的应用程序将Dataframe保存在多个分区中。

根据Spark 1.3.1文档,这是分区镶木地板文件的方法:

Partition Discovery

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)

2 个答案:

答案 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)。