Spark分组调整

时间:2016-10-25 03:09:35

标签: apache-spark apache-spark-sql spark-dataframe bigdata

给出以下文件:

  • 员工
  • 技能
  • 报告
  • 等。

在员工和每个其他文件之间存在1对N的关系,例如一个员工对应多种技能。每个文件介于500MB到1.5GB之间,总共大约有10个文件。 对于每个员工,我想汇总/收集所有文件(技能,报告等)中的所有信息,并将其写入XML结构:

<employees>
  <employee>
    <skills>
      <skill>...</skill>
      <skill>...</skill>
      ...
    </skills>
    <reports
      <report>...</report>
      <report>...</report>
      ...
    </reports>
    ...
  </employee>
  ...
</employees>

我正在做一些事情:

val employeesRdd = employeesDf.map(r => (r.getAs[String]("employeeId"), r))
val skillsRdd = skillsDf.map(r => (r.getAs[String]("employeeId"), r)).groupByKey()
val reportsRdd = reportsDf.map(r => (r.getAs[String]("employeeId"), r)).groupByKey()
...

employeesRdd
  .leftOuterJoin(skillsRdd)
  .leftOuterJoin(reportsRdd)
  ...
  .toLocalIterator
  ... // write <employee> nodes one by one

我遇到的问题是所有的groupByKey()操作都很慢,就像很长时间一样。由于java.lang.OutOfMemoryError:超出了GC开销限制,因此运行了这么长时间后它会爆炸。我在本地模式下使用Spark 1.5.1,并为jvm分配了大约20GB。

1 个答案:

答案 0 :(得分:0)

Spark DataFrame的分区应该是您的最佳选择。

相关将有助于将相关信息的数据存储在neary中。所以它有助于快速访问所需信息的过程。

offical docdoc