Apache spark 使用数据集、大型java类和单例时的火花传递函数

Apache spark 使用数据集、大型java类和单例时的火花传递函数,apache-spark,parquet,apache-spark-dataset,Apache Spark,Parquet,Apache Spark Dataset,我在这里读过这篇文章:(参见将函数传递给Spark),但我的用例是将类型化数据集与我的用例类一起使用。我试图使用singleton对象来保存映射方法。我想知道如何最好地打包优化舞台性能所需的功能(将数据集从一种类型转换为另一种类型,并写入拼花地板) 目前,在s3中,阶段步骤需要花费相当长的时间才能完成大约300万行(约1.5小时),大约880MB的数据输出到拼花地板中 我在群集模式下运行,使用最小执行器=3,最大执行器=10,每个执行器上有4个内核,驱动程序内存为8gb -- 高级编码部分: 我

我在这里读过这篇文章:(参见将函数传递给Spark),但我的用例是将类型化数据集与我的用例类一起使用。我试图使用singleton对象来保存映射方法。我想知道如何最好地打包优化舞台性能所需的功能(将数据集从一种类型转换为另一种类型,并写入拼花地板)

目前,在s3中,阶段步骤需要花费相当长的时间才能完成大约300万行(约1.5小时),大约880MB的数据输出到拼花地板中

我在群集模式下运行,使用最小执行器=3,最大执行器=10,每个执行器上有4个内核,驱动程序内存为8gb

--

高级编码部分:

我正在将一个案例类别C1映射到另一个案例类别C2。C1和C2大约有16个字段,类型各异,如java.sql.Timestamp、Option[String]Option[Int]、String、Int、BigInt

case class C1(field1 : _, field2 : _, field3 : _, ...)
case class C2(field1 : _, field2 : _, field3 : _, ...)
为了从C1映射到C2,我需要复制的非常大的java类J的功能(静态方法)

我在一个util类util中编写了映射函数,该类有许多其他由映射函数调用的有用函数

=========

基本上,我的代码流如下所示:

case class C1(field1 : _, field2 : _, field3 : _, ...)
case class C2(field1 : _, field2 : _, field3 : _, ...)

// very large java class J that only contains static methods
public class J {
   public static String getValue((float) v) = ...

   ...
}    

object Util {
  def m1(i: Int): Int = ...

  def m2(l: Option[BigDecimal], l2: Option[BigDecimal]): Int = {
      J.getValue(l.get, l2.get)
  }

  ...

  def convert_C1_to_C2(c1: C1): C2 = {
    C2(
      field1 = m1(c1.field1),
      field2 = m2(c1.field2, c1.field3),
      ...
  }
}

dataframe.as[C1].map(Util.convert_C1_to_C2)
    .mode(SaveMode.Overwrite)
    .parquet("s3a://s3Path")
有没有更好的方法来写这个?或者有人能指出我在这方面的任何明显错误吗?看看我的代码,我不知道为什么要花这么长时间才能完成任务


我已经尝试过合并16个分区来减少s3中的文件量,但这似乎会使作业运行得更慢。通常会有64个没有任何合并的分区。

您可能刚刚遇到了所涉及的slow-fakes-s3-rename问题。这里讨论了一些修复方法。

您可能刚刚遇到了所涉及的slow-fakes-s3-rename问题。这里讨论了一些修复方法

case class C1(field1 : _, field2 : _, field3 : _, ...)
case class C2(field1 : _, field2 : _, field3 : _, ...)

// very large java class J that only contains static methods
public class J {
   public static String getValue((float) v) = ...

   ...
}    

object Util {
  def m1(i: Int): Int = ...

  def m2(l: Option[BigDecimal], l2: Option[BigDecimal]): Int = {
      J.getValue(l.get, l2.get)
  }

  ...

  def convert_C1_to_C2(c1: C1): C2 = {
    C2(
      field1 = m1(c1.field1),
      field2 = m2(c1.field2, c1.field3),
      ...
  }
}

dataframe.as[C1].map(Util.convert_C1_to_C2)
    .mode(SaveMode.Overwrite)
    .parquet("s3a://s3Path")