以下是我使用Apache Spark的用例
1)我在HDFS上有大约2500个Parquet文件,文件大小因文件而异。
2)我需要处理每个镶木地板文件并构建一个新的DataFrame并将新的DataFrame写入orc文件格式。
3)我的Spark驱动程序是这样的。 我正在迭代每个文件,处理单个镶木地板文件创建一个新的DataFrame并将新的DataFrame写为ORC,下面是代码片段。
val fs = FileSystem.get(new Configuration())
val parquetDFMap = fs.listStatus(new Path(inputFilePath)).map(folder => {
(folder.getPath.toString, sqlContext.read.parquet(folder.getPath.toString))})
parquetDFMap.foreach {
dfMap =>
val parquetFileName = dfMap._1
val parqFileDataFrame = dfMap._2
for (column <- parqFileDataFrame.columns)
{
val rows = parqFileDataFrame.select(column)
.mapPartitions(lines => lines.filter(filterRowsWithNullValues(_))
.map(row => buildRowRecords(row, masterStructArr.toArray, valuesArr)))
val newDataFrame: DataFrame = parqFileDataFrame.sqlContext.createDataFrame(rows, StructType(masterStructArr))
newDataFrame.write.mode(SaveMode.Append).format("orc").save(orcOutPutFilePath+tableName)
}
}
这种设计的问题我只能及时处理一个镶木地板文件,只有当我创建一个新的数据框并且新的DataFrame被写入ORC格式时才会应用并行性。因此,如果任何任务(如创建新的DataFrame或将新的DataFrame写入ORC)需要很长时间才能完成其他排列的镶木地板处理,则会一直停留,直到当前的镶木地板操作完成。
请帮助我为这个用例提供更好的方法或设计。
答案 0 :(得分:1)
您可以为所有镶木地板文件创建单个数据框,而不是为每个文件创建一个数据框
val df = sqlContext.read.parquet(inputFilePath)
df.map(row => convertToORc(row))