开发者社区> 问答> 正文

根据列中的值复制Spark数据帧中的行

我想根据给定列的值复制行。例如,我得到了这个DataFrame:

count
3
1
4

我想得到:

count
3
3
3
1
4
4
4
4

withColum根据这个答案我尝试使用方法。

val replicateDf = originalDf

.withColumn("replicating", explode(array((1 until $"count").map(lit): _*)))
.select("count")

但是$"count"是一个ColumnName并且不能用于在上面的表达式中表示它的值。

(我也尝试了explode(Array.fill($"count"){1})同样的问题。)有更简洁的方法吗?

展开
收起
社区小助手 2018-12-06 15:15:49 3475 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    array_repeat从2.4开始提供。如果您需要较低版本的解决方案,可以使用udf()或rdd。对于Rdd,请检查一下

    import scala.collection.mutable._

    val df = Seq(3,1,4).toDF("count")
    val rdd1 = df.rdd.flatMap( x=> { val y = x.getAsInt; for ( p <- 0 until y ) yield Row(y) } )
    spark.createDataFrame(rdd1,df.schema).show(false)
    结果:

    count
    3
    3
    3
    1
    4
    4
    4
    4

    对于udf(),下面会有效

    val df = Seq(3,1,4).toDF("count")
    def array_repeat(x:Int):Array[Int]={
    val y = for ( p <- 0 until x )yield x
    y.toArray
    }
    val udf_array_repeat = udf (array_repeat(_:Int):Array[Int] )
    df.withColumn("count2", explode(udf_array_repeat('count))).select("count2").show(false)

    2019-07-17 23:18:33
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载