复制Spark行N次

时间:2016-11-03 09:20:00

标签: scala apache-spark

我想在DataFrame中复制一行,我该怎么做?

例如,我有一个由1行组成的DataFrame,我想创建一个具有100个相同行的DataFrame。我提出了以下解决方案:

  var data:DataFrame=singleRowDF

   for(i<-1 to 100-1) {
       data = data.unionAll(singleRowDF)
   }

但是这引入了许多转换,似乎我的后续行动变得非常缓慢。还有其他办法吗?

3 个答案:

答案 0 :(得分:15)

您可以添加一个文字值为100的数组的列,然后使用explode使其每个元素创建自己的行;然后,摆脱这个“虚拟”专栏:

import org.apache.spark.sql.functions._

val result = singleRowDF
  .withColumn("dummy", explode(array((1 until 100).map(lit): _*)))
  .selectExpr(singleRowDF.columns: _*)

答案 1 :(得分:0)

你可以选出单行,制作一个包含一百个元素的列表,填充该行并将其转换回数据帧。

import org.apache.spark.sql.DataFrame

val testDf = sc.parallelize(Seq(
    (1,2,3), (4,5,6)
)).toDF("one", "two", "three")

def replicateDf(n: Int, df: DataFrame) = sqlContext.createDataFrame(
    sc.parallelize(List.fill(n)(df.take(1)(0)).toSeq), 
    df.schema)

val replicatedDf = replicateDf(100, testDf)

答案 2 :(得分:0)

您可以使用flatMap或理解性的here

我鼓励您每次都使用DataSet,但如果不可能,则链接中的最后一个示例也适用于DataFrames:

val df = Seq(
  (0, "Lorem ipsum dolor", 1.0, List("prp1", "prp2", "prp3"))
).toDF("id", "text", "value", "properties")

val df2 = for {
  row <- df
  p <- row.getAs[Seq[String]]("properties")
} yield (row.getAs[Int]("id"), row.getAs[String]("text"), row.getAs[Double]("value"), p)

还请记住,explode已过时,请参见here