Java 将索引列添加到现有Spark';s数据帧
我使用Spark 1.5操作,使用Java。我需要将ID/索引列附加到现有数据帧,例如:Java 将索引列添加到现有Spark';s数据帧,java,apache-spark,Java,Apache Spark,我使用Spark 1.5操作,使用Java。我需要将ID/索引列附加到现有数据帧,例如: +---------+--------+ | surname| name| +---------+--------+ | Green| Jake| | Anderson| Thomas| | Corleone| Michael| | Marsh| Randy| | Montana| Tony| | Green| Julia| |Brenneman| E
+---------+--------+
| surname| name|
+---------+--------+
| Green| Jake|
| Anderson| Thomas|
| Corleone| Michael|
| Marsh| Randy|
| Montana| Tony|
| Green| Julia|
|Brenneman| Eady|
| Durden| Tyler|
| Corleone| Vito|
| Madiro| Mat|
+---------+--------+
我希望每一行都附加索引,范围在1和表记录数量之间。索引顺序无关紧要,任何行都必须只包含唯一的ID/索引。它可以通过转换为RDD并附加索引行和转换为具有修改的StructType的DataFrame来完成,但是,如果我理解正确的话,此操作会为转换等消耗大量资源,必须有另一种方法。
结果必须如下所示:
+---------+--------+---+
| surname| name| id|
+---------+--------+---+
| Green| Jake| 3|
| Anderson| Thomas| 5|
| Corleone| Michael| 2|
| Marsh| Randy| 10|
| Montana| Tony| 7|
| Green| Julia| 1|
|Brenneman| Eady| 2|
| Durden| Tyler| 9|
| Corleone| Vito| 4|
| Madiro| Mat| 6|
+---------+--------+---+
谢谢。您可以使用withColumn函数。用法应该类似于Val myDF=existingDF.withColumn(“index”),express(random(1,existingDF.count())伙计们,这是一种很好的方法:
模拟RDD中的ZipWithIndex方法…第一个建议性能更好,但与纯Dataframes解决方案相比没有什么大不了的(在我的场景中,表中有100多行)。在Scala中,首先我们需要创建一个索引数组:
val indx_arr=(1 to your_df.count.toInt).toArray
indx_arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
现在,我们想将此列附加到数据帧。
首先,我们打开数据帧并将其作为一个数组,然后使用indx_arr
压缩它,然后将新创建的数组转换回and RDD。最后一步是将其作为一个数据帧:
final_df = sc.parallelize((your_df.collect.map(
x=>(x(0),x(1))) zip indx_arr).map(
x=>(x._1._1.toString,x._1._2.toString,x._2))).toDF("surname","name","id")
这也是一种将任何类型的数组附加到Spark数据帧的简单而直接的方法。在Spark数据帧中执行此操作的最简洁方法:
.withColumn("idx",monotonically_increasing_id())
完整的文档:我知道这个问题可能是很久以前的事了,但您可以按如下方式解决:
from pyspark.sql.window import Window
w = Window.orderBy("myColumn")
withIndexDF = originalDF.withColumn("index", row_number().over(w))
- myColumn:数据帧中的任何特定列
- originalDF:没有索引列的原始数据帧
express
?Expr来表达问题:>我希望每一行都附加索引,范围在1和表记录数量之间。从的代码中单调递增\u id()
:>生成的ID保证是单调递增且唯一的,但不是连续的。当使用window With partition子句时,会出现所有数据落入单个分区的警告,这可能会导致性能严重下降。