Estoy trabajando en una tarea de evaluación comparativa y necesito generar millones de filas de eventos json.

Aquí está mi código de muestra:

def generateEntry() = {
 s"""
    |{
    | "memberId": ${java.util.UUID.randomUUID.toString},
    | "first_name": ${nameRandomizer},
    | "last_name": ${nameRandomizer
    |}""".stripMargin
}

// Generate 1000000 rows of Json String with fields: memberId, first_name, last_name
val entryList = mutable.ListBuffer[String]()
for (_ <- 1 to 1000000) {
 entryList += generateEntry()
}

val inputRDD: RDD[String] = sc.parallelize(entryList.result())

Sin embargo, esto está provocando un error:

Java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
    at java.lang.StringBuilder.append(StringBuilder.java:136)
    at scala.StringContext.standardInterpolator(StringContext.scala:126)
    at scala.StringContext.s(StringContext.scala:95)

Por cierto, estoy codificando en chispa. Intenté hacer esto por lotes, pero todavía parece que se produce un error. Avíseme o proporcione un código de muestra que pueda usar como guía para solucionar este problema. ¡Gracias!

-1
Code Geek 12 mar. 2021 a las 12:47

1 respuesta

La mejor respuesta

El búfer de lista no es necesario. Simplemente puede asignar un rango Spark a su función:

val inputRDD: RDD[String] = spark.range(1000000).rdd.map(x => generateEntry())
2
mck 12 mar. 2021 a las 09:52