我有多个实木复合地板文件(大约1000个)。我需要加载它们中的每一个,对其进行处理并将结果保存到Hive表中。我有一个for循环,但它似乎只能处理2个或5个文件,而不能处理1000个文件,因为Sparks似乎尝试同时加载所有文件,因此我需要在同一Spark会话中单独进行操作。 / p>
我尝试使用for循环,然后使用for循环,然后使用unpersist(),但无论如何还是失败。
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,处理数据,将其保存到Hive表中,然后关闭该日期并与第二个ID继续匹配,依此类推,直到完成1000个文件。而不是尝试同时加载所有内容。
任何帮助将不胜感激!我已经坚持了好几天。我在Scala中使用Spark 1.6谢谢!
编辑:添加了定义。希望它可以帮助获得更好的视野。谢谢!
答案 0 :(得分:0)
好吧,经过大量检查,我意识到该过程运行良好。它单独处理每个文件并保存结果。问题在于,在某些非常特殊的情况下,该过程会持续很长时间。
因此,我可以使用for循环告诉您,或者对于每个循环,您可以处理多个文件并保存结果而不会出现问题。持久化和清除缓存有助于提高性能。