Java& Spark:向数据集

时间:2017-08-03 09:30:47

标签: java apache-spark

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

即使使用zipWithUniqueId(),我也成功添加了zipWithIndexmonotonically_increasing_id()的ID。但是没有人满意。

示例:我有一个包含195行的数据集。当我使用这三种方法中的一种时,我会得到一些像 1584156487 12036 的ID。另外,那些id不是连续的。

我需要/想要的只是简单:一个整数id列,其值为1到dataset.count()foreach行,其中id = 1后跟id = 2等。

我怎样才能在Java / Spark中做到这一点?

4 个答案:

答案 0 :(得分:4)

您可以尝试使用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")))

答案 1 :(得分:0)

在Scala中,您可以按照以下方式执行此操作。

 var a = dataframe.collect().zipWithIndex
    for (  b:(Row,Int)<-a){
      println(b._2) 

    }

这里b._2你将获得从0开始到第-1行的唯一数字

答案 2 :(得分:0)

您还可以生成一个唯一的增加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)))

希望这有帮助!

答案 3 :(得分:0)

如果您希望使用流数据帧,则可以将udf与guid生成器一起使用:

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())