如何解决我将如何重复Scala数据帧中的每一行N次
以下是数据框的前面:
以下是:
注意重复的行是如何彼此相邻的,而不是从头开始从头开始重新构建数据框。
谢谢
解决方法
尝试使用具有 array_repeat
功能的 struct
,然后分解该阵列。
Example:
df.show()
/*
+----+----+
|col1|col2|
+----+----+
| 1| 4|
| 2| 5|
| 3| 6|
+----+----+
*/
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
df.withColumn("arr",explode(array_repeat(struct(df.columns.head,df.columns.tail:_*),7))).
select("arr.*").
toDF("col1","col2").
show(100,false)
/*
+----+----+
|col1|col2|
+----+----+
|1 |4 |
|1 |4 |
|1 |4 |
|1 |4 |
|1 |4 |
|1 |4 |
|1 |4 |
|2 |5 |
|2 |5 |
|2 |5 |
|2 |5 |
|2 |5 |
|2 |5 |
|2 |5 |
|3 |6 |
|3 |6 |
|3 |6 |
|3 |6 |
|3 |6 |
|3 |6 |
|3 |6 |
+----+----+
*/
,
这是一个复制DataFrame
的函数:
def repeatRows(df: DataFrame,numRepeats: Int): DataFrame = {
(1 until numRepeats).foldLeft(df)((growingDF,_) => growingDF.union(df))
}
对结果DataFrame
进行排序的问题与复制过程是分开的,因此不包含在函数中,但此后可以轻松实现。
让我们来解决您的问题:
// Problem setup
val someDF = Seq((1,4),(2,(3,6)).toDF("col1","col2")
// Duplicate followed by sort
val duplicatedSortedDF = repeatRows(someDF,3).sort("col1")
// Show result
duplicatedSortedDF.show()
+----+----+
|col1|col2|
+----+----+
| 1| 4|
| 1| 4|
| 1| 4|
| 2| 4|
| 2| 4|
| 2| 4|
| 3| 6|
| 3| 6|
| 3| 6|
+----+----+
就在那里。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。