Apache spark 如何按原始顺序克隆spark中的列值

Apache spark 如何按原始顺序克隆spark中的列值,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,我希望将列的值按原始顺序克隆n次。 例如,如果我想在下面的列中复制2次: +---+ | v | +---+ | 1 | | 2 | | 3 | +---+ 我要找的是: +---+ | v | +---+ | 1 | | 2 | | 3 | | 1 | | 2 | | 3 | +---+ 使用explode或flatMap,我只能获得: +---+ | v | +---+ | 1 | | 1 | | 2 | | 2 | | 3 | | 3 | +---+ 代码: 我可能可以对数据集ds进

我希望将列的值按原始顺序克隆n次。 例如,如果我想在下面的列中复制2次:

+---+
| v |
+---+
| 1 |
| 2 |
| 3 |
+---+
我要找的是:

+---+
| v |
+---+
| 1 |
| 2 |
| 3 |
| 1 |
| 2 |
| 3 |
+---+
使用explode或flatMap,我只能获得:

+---+
| v |
+---+
| 1 |
| 1 |
| 2 |
| 2 |
| 3 |
| 3 |
+---+
代码:

我可能可以对数据集ds进行自合并,但如果cloneCount很大,例如cloneCount=200000,那么在循环中多次合并是否是首选解决方案?

您可以尝试以下方法:

//如果希望列值按递增/递减顺序排列
//然后我们将其添加到orderBy:clone\u索引和col\u值
//按照最初的顺序获取值
val clonedDs=ds.flatMap(col_值=>Range(0,cloneCount)
.map(克隆索引=>(克隆索引,列值)))
clonedDs.orderBy(“_1”,“_2”).map(_._2).show()
//如果不希望列值遵循顺序
//然后我们添加另一个rank列,并在orderBy中与clone_索引一起使用它
//按所需顺序获取列值
val clonedDs=ds.withColumn(“rank”,单调递增的id())
.flatMap(行=>范围(0,克隆计数).map(
克隆索引=>(克隆索引,row.getLong(1),row.getLong(0))
) )
clonedDs.orderBy(“_1”,“_2”).map(_._3).show()

Hi Lokesh,感谢您的快速回复。但这一秩序仍然没有得到维护。val ds=spark.range(1,4)val cloneCount=6 val clonedDs=ds.flatMap(r=>range(0,cloneCount.map(x=>(x,r)))clonedDs.orderBy(“1”).map(._2).show()输出:+----+|值+----+| 1 | | 2 | | 3 | | 2 | | 3 | | 1 | | 2 | | 1 | | | 2 | | | | | | | | 3 | | | | | 1 | | | 1 | | | 1 | | | 1 | | | | 2 |。之前没有意识到,我只是在本地模式下尝试。如果您的列值按顺序排列,那么您也可以将该列添加到orderBy。这应该可以解决问题
clonedDs.orderBy(“_1”,“_2”).map(_._2).show()
否则,我们可以向数据中添加一个列,而不是列值,然后按克隆索引和列进行排序。我正在把它添加到答案中,明白了,或者我可以在克隆之前对列进行排序。我总是希望这些值是数值。只是列和cloneCount中的值的数量可能都很大,之前对列进行排序并不能保证按clone\u索引排序后的顺序。添加克隆索引后,我们需要按列值排序。检查我的最新答案。
%spark
val ds = spark.range(1, 4)
val cloneCount = 2

val clonedDs = ds.flatMap(r => Seq.fill(cloneCount)(r))
clonedDs.show()