Scala 如何在for循环中单独处理多个拼花地板文件?
我有多个拼花文件(大约1000个)。我需要加载它们中的每一个,对其进行处理并将结果保存到配置单元表中。我有一个for循环,但它似乎只能处理2或5个文件,而不能处理1000个文件,因为Sparks似乎试图同时加载所有文件,我需要它在同一个Spark会话中单独执行 我尝试使用for循环,然后使用for-each,使用unpersist(),但还是失败了Scala 如何在for循环中单独处理多个拼花地板文件?,scala,apache-spark,Scala,Apache Spark,我有多个拼花文件(大约1000个)。我需要加载它们中的每一个,对其进行处理并将结果保存到配置单元表中。我有一个for循环,但它似乎只能处理2或5个文件,而不能处理1000个文件,因为Sparks似乎试图同时加载所有文件,我需要它在同一个Spark会话中单独执行 我尝试使用for循环,然后使用for-each,使用unpersist(),但还是失败了 val ids = get_files_IDs() ids.foreach(id => { println("Starting file "
val ids = get_files_IDs()
ids.foreach(id => {
println("Starting file " + id)
var df = load_file(id)
var values_df = calculate_values(df)
values_df.write.mode(SaveMode.Overwrite).saveAsTable("table.values_" + id)
df.unpersist()
})
def get_files_IDs(): List[String] = {
var ids = sqlContext.sql("SELECT CAST(id AS varchar(10)) FROM table.ids WHERE id IS NOT NULL")
var ids_list = ids.select("id").map(r => r.getString(0)).collect().toList
return ids_list
}
def calculate_values(df:org.apache.spark.sql.DataFrame): org.apache.spark.sql.DataFrame ={
val values_id = df.groupBy($"id", $"date", $"hr_time").agg(avg($"value_a") as "avg_val_a", avg($"value_b") as "avg_value_b")
return values_id
}
def load_file(id:String): org.apache.spark.sql.DataFrame = {
val df = sqlContext.read.parquet("/user/hive/wh/table.db/parquet/values_for_" + id + ".parquet")
return df
}
我所期望的是Spark加载文件ID 1,处理数据,将其保存到配置单元表,然后取消该日期并继续使用第二个ID,依此类推,直到完成1000个文件。而不是试图同时加载所有内容
任何帮助都将不胜感激!我已经坚持了好几天了。我在Scala上使用Spark 1.6谢谢
编辑:添加了定义。希望能有助于获得更好的视野。谢谢大家! 好的,所以经过大量检查后,我意识到这个过程运行良好。它单独处理每个文件并保存结果。问题是,在一些非常具体的情况下,这一进程正在走上漫长的道路
因此,我可以告诉您,使用for循环或for-each,您可以处理多个文件并毫无问题地保存结果。取消持久化和清除缓存确实有助于提高性能。好的,所以经过大量检查后,我意识到该过程工作正常。它单独处理每个文件并保存结果。问题是,在一些非常具体的情况下,这一进程正在走上漫长的道路
因此,我可以告诉您,使用for循环或for-each,您可以处理多个文件并毫无问题地保存结果。取消持久化和清除缓存有助于提高性能。ID的类型是什么?为什么要使用
var
取消val
?同时尝试取消持久化值\u df
。我不知道您的load_file
和calculate_value
中有什么逻辑,但您也可以在取消持久化数据帧后尝试执行sparkSession.sqlContext.clearCache()。我已经添加了定义,这就是我正在使用的全部代码。我将测试@DmitryY的内容。建议。我使用var只是为了看看它是否有所不同,我从Beggining开始就使用val。非常感谢。ids
的类型是什么?为什么要使用var
而不是val
?同时尝试取消持久化值\u df
。我不知道您的load_file
和calculate_value
中有什么逻辑,但您也可以在取消持久化数据帧后尝试执行sparkSession.sqlContext.clearCache()。我已经添加了定义,这就是我正在使用的全部代码。我将测试@DmitryY的内容。建议。我使用var只是为了看看它是否有所不同,我从Beggining开始就使用val。非常感谢。