首页 > 解决方案 > 如何在 Spark 中生成大字数文件?

问题描述

我想为性能测试生成 1000 万行的字数文件(每行都有相同的句子)。但我不知道如何编码。

您可以给我一个示例代码,并直接将文件保存在 HDFS 中。

标签: apache-spark

解决方案


你可以尝试这样的事情。

生成 1 列,其值从 1 到 100k 和 1 列,值从 1 到 100 用explode(column) 将它们都炸开。您无法生成一列具有 10 Mil 值的列,因为 kryo 缓冲区会引发错误。

我不知道这是否是最好的性能方式,但这是我现在能想到的最快方式。

val generateList = udf((s: Int) => {
    val buf = scala.collection.mutable.ArrayBuffer.empty[Int]
    for(i <- 1 to s) {
        buf += i
    }
    buf
})

val someDF = Seq(
  ("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
).toDF("sentence")

val someDfWithMilColumn = someDF.withColumn("genColumn1", generateList(lit(100000)))
   .withColumn("genColumn2", generateList(lit(100)))
val someDfWithMilColumn100k  = someDfWithMilColumn
   .withColumn("expl_val", explode($"mil")).drop("expl_val", "genColumn1")
val someDfWithMilColumn10mil = someDfWithMilColumn100k
   .withColumn("expl_val2", explode($"10")).drop("genColumn2", "expl_val2")

someDfWithMilColumn10mil.write.parquet(path)

推荐阅读