使用Spark和Java,我试图添加到现有数据集[Row],其中n列为Integer标识列。
即使使用zipWithUniqueId()
,我也成功添加了zipWithIndex
或monotonically_increasing_id()
的ID。但是没有人满意。
示例:我有一个包含195行的数据集。当我使用这三种方法中的一种时,我会得到一些像 1584156487 或 12036 的ID。另外,那些id不是连续的。
我需要/想要的只是简单:一个整数id列,其值为1到dataset.count()foreach行,其中id = 1后跟id = 2等。
我怎样才能在Java / Spark中做到这一点?
答案 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())