根据列中的值复制Spark数据帧中的行-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

社区小助手 2018-12-06 15:15:49 757

我想根据给定列的值复制行。例如,我得到了这个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})同样的问题。)有更简洁的方法吗?

分布式计算 Spark
分享到
取消 提交回答
全部回答(1)
  • 社区小助手
    2019-07-17 23:18:33

    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)

    0 0
大数据
使用钉钉扫一扫加入圈子
+ 订阅

大数据计算实践乐园,近距离学习前沿技术

推荐文章
相似问题