我构建了一个spark应用程序以计算错误统计信息文件。在我当前的工作流程中:
我从这些数据中计算出大约30个数据帧,每个数据帧都是我需要的统计数据。每个数据框按5列分组(一个时间列+ 4个业务列)。数据帧计算如下所示:
parquetDf.filter($"col1" === "avalue" and $"col2" === 0 and $"col3".isnotnull and ...).select($"col1", $"col2", $"col3", $"col4", $"col5").groupBy($"col1", $"col2", $"col3", $"col4", $"col5").sum()
对于每个统计信息,filter子句都不相同,可以是sum(),agg(countDistinct()),min(),max()
我加入了所有这些数据框
spark.createDataFrame(spark.sparkContext.emptyRDD[Row], schema).join(dataframe1, Seq("col1", "col2", "col3", "col4", "col5"), "full_outer")
结果是5列的任意组合的5列汇总的所有统计信息
col1 col2 col3 col4 col5 stat1 stat2 stat3 stat...
问题在于它性能不高:速度慢,但是数据过多,它会崩溃
Container [pid=30713,containerID=container_e17_15240455195_33112_02_00001] is running beyond physical memory limits. Current usage: 1.5 GB of 1.5 GB physical memory used; 3.5 GB of 3.1 GB virtual memory used. Killing container.
我是新手,但是我想这是一个常见的用例。如何以高效的方式进行计算?