我想根据给定列的值复制行。例如,我得到了这个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})同样的问题。)有更简洁的方法吗?
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)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。