繁体   English   中英

Java&Spark:向数据集添加唯一的增量ID

[英]Java & Spark : add unique incremental id to dataset

使用Spark和Java,我试图添加到现有的数据集[Row],其中n列为Integer标识列。

我成功地使用zipWithUniqueId()zipWithIndex添加了一个id,甚至使用了monotonically_increasing_id() 但是没有人满意。

示例:我有一个195行的数据集。 当我使用这三种方法中的一种时,我会得到一些像158415648712036的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM