Scala 火花内存不足异常

Scala 火花内存不足异常,scala,apache-spark,Scala,Apache Spark,我每天收到10 GB的文件,其中包含员工详细信息。需要从前一天和当前日期的文件中选择最新记录。例如:8月6日和8月7日的文件需要在时间戳列上进行比较,并选择最新记录 8月6日档案 emp-id name dept phone-No time-Stamp 1 Jhon Sales 817234518 12-6-2019 2 Marry Production 927234565 4-3-2019 3

我每天收到10 GB的文件,其中包含员工详细信息。需要从前一天和当前日期的文件中选择最新记录。例如:8月6日和8月7日的文件需要在时间戳列上进行比较,并选择最新记录

  • 8月6日档案

    emp-id   name   dept        phone-No    time-Stamp
    1       Jhon   Sales       817234518   12-6-2019     
    2       Marry  Production  927234565   4-3-2019 
    3       James  Marketing   625234522   21-1-2019 
    
    emp-id   name   dept        phone-No    time-Stamp
    1       Jhon   Sales       817234518   12-7-2019     
    4       Jerry  Sales       653214442   12-7-2019 
    3       James  Marketing   625234522   2-6-2019 
    
  • 8月7日档案

    emp-id   name   dept        phone-No    time-Stamp
    1       Jhon   Sales       817234518   12-6-2019     
    2       Marry  Production  927234565   4-3-2019 
    3       James  Marketing   625234522   21-1-2019 
    
    emp-id   name   dept        phone-No    time-Stamp
    1       Jhon   Sales       817234518   12-7-2019     
    4       Jerry  Sales       653214442   12-7-2019 
    3       James  Marketing   625234522   2-6-2019 
    
  • 预期产量

    emp-id   name   dept        phone-No    time-Stamp
    1       Jhon   Sales       817234518   12-7-2019     
    2       Marry  Production  927234565   4-3-2019 
    3       James  Marketing   625234522   2-5-2019
    4       Jerry  Sales       653214442   12-7-2019  
    
我尝试了以下解决方案,并得到了预期的结果

 val mergedDF = currentDayDF.union(previousDayDF)

mergedDF.show(false)

val windowSpec = Window.partitionBy("emp-id").orderBy(col("timeStamp").desc)
val latestForEachKey = mergedDF.withColumn("rank", rank().over(windowSpec))
                               .filter(col("rank") === 1)
                               .drop("rank")
问题

  • 每天的输入文件大小为10 GB,如果集群内存(执行器的总内存)小于20 GB,则加载两个数据集(前一天和当前一天)将引发内存溢出异常

    我认为spark将大文件划分为要处理的分区,因此在开始时只有很少的分区加载到执行器内存中,转换应用了中间结果数据集并将其保存到辅助内存中,然后继续处理剩余的分区。但是,由于其更广泛的转换,parition by需要所有的数据分区。我猜是错误的。那么spark会抛出异常吗


  • 分区用于并行执行。Spark将尝试在所有可用分区中同时加载所有20GB数据。如果创建分区的所有执行器的组合内存小于20 GB,则会抛出内存不足错误

    请尝试将每个问题帖子限制为一个问题,请参见例如:。您写道您尝试了上面的
    连接。结果是什么?它与您想要的有什么不同?我编辑了问题并包含了输出。谢谢,我对这个问题投了否决票,我决定结束这个问题,因为它太宽泛了。正如@Shaido所说:“将每个问题帖子限制为一个问题”。你的一些问题也已经在网站上得到了回答。你只需要寻找它们。我已经根据收到的评论更改了问题范围,请帮助我回答。我在发布之前已经搜索了答案question@Niketa当前位置对我来说,它仍然像两个独立的问题?一个是关于内存问题,另一个是关于如何进行连接以获得预期的输出。或者运行该代码时是否发生内存异常?