[英]Java & Spark : add unique incremental id to dataset
使用Spark和Java,我试图添加到现有的数据集[Row],其中n列为Integer标识列。
我成功地使用zipWithUniqueId()
或zipWithIndex
添加了一个id,甚至使用了monotonically_increasing_id()
。 但是没有人满意。
示例:我有一个195行的数据集。 当我使用这三种方法中的一种时,我会得到一些像1584156487或12036的ID 。 另外,那些id不是连续的。
我需要/想要的只是简单:一个Integer id列,其值为1到dataset.count()foreach行,其中id = 1后跟id = 2,等等。
我怎么能在Java / Spark中做到这一点?
您可以尝试使用row_number函数:
在java中:
import org.apache.spark.sql.functions;
import org.apache.spark.sql.expressions.Window;
df.withColumn("id", functions.row_number().over(Window.orderBy("a column")));
或者在scala中:
import org.apache.spark.sql.expressions.Window;
df.withColumn("id",row_number().over(Window.orderBy("a column")))
在Scala中,您可以执行以下操作。
var a = dataframe.collect().zipWithIndex
for ( b:(Row,Int)<-a){
println(b._2)
}
在这里b._2,您将获得从0到第-1行的唯一编号
您还可以生成一个唯一的增加ID,如下所示
val df1 = spark.sqlContext.createDataFrame(
df.rdd.zipWithIndex.map {
case (row, index) => Row.fromSeq(row.toSeq :+ index)
},
StructType(df.schema.fields :+ StructField("id", LongType, false)))
希望这可以帮助!
如果您希望使用流数据帧,可以使用带有guid生成器的udf:
val generateUuid = udf(() => java.util.UUID.randomUUID.toString())
// Cast the data as string (it comes in as binary by default)
val ddfStream = ddfStream.withColumn("uniqueId", generateUuid())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.