我想在DataFrame中复制一行,我该怎么做?
例如,我有一个由1行组成的DataFrame,我想创建一个具有100个相同行的DataFrame。我提出了以下解决方案:
var data:DataFrame=singleRowDF
for(i<-1 to 100-1) {
data = data.unionAll(singleRowDF)
}
但是这引入了许多转换,似乎我的后续行动变得非常缓慢。还有其他办法吗?
答案 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。