Spark Scala:Spark Scala中的增量数据加载以及唯一Id的生成

Spark Scala:Spark Scala中的增量数据加载以及唯一Id的生成,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我正在使用zipWithIndex生成序列号,并将其作为一个单独的列添加。 我使用的代码与以下类似: val file = sparkSession.createDataFrame(lexusmasterrdd,structSchema) val filerdd=file.rdd.zipWithIndex().map(indexedRow => Row.fromSeq((((indexedRow._2.toLong+1)).toLong) +: indexedRow._1.toSeq))

我正在使用
zipWithIndex
生成
序列号
,并将其作为一个单独的列添加。 我使用的代码与以下类似:

val file = sparkSession.createDataFrame(lexusmasterrdd,structSchema)
val filerdd=file.rdd.zipWithIndex().map(indexedRow => Row.fromSeq((((indexedRow._2.toLong+1)).toLong) +: indexedRow._1.toSeq))
val newSchema=StructType(Array(StructField("Sequence_number",LongType,true)).++(file.schema.fields))
val finalDF=sparkSession.createDataFrame(filerdd,newSchema)
我现在正试图为同样的问题提出一个增量负载的逻辑。 一个简单的加载,其中新数据被附加到现有数据,序列号从最后生成的数字生成

实现这一点的一种方法是获取
max(Sequence\u number)
,然后为新数据添加
row\u number()
函数

但是,有没有其他方法可以在增量加载中使用
zipWithIndex
? 一些代码可能会有帮助

我将Spark 2.3与Scala一起使用

实现这一点的一种方法是获取最大值(序列号),然后 与用于新数据的row_number()函数一起添加

这会起作用,但不会扩展,因为
行\u number()
需要将所有记录洗牌到一个分区中。我宁愿使用
单调地增加id()

如果要使用zipWithIndex,可以使用类似的方法:

//get max from "old" data
val prevMaxId = oldDf.select(max($"Sequence_number")).as[Long].head()    
val finalRDD = oldRdd.zipWithIndex().map{case (data,id) => (data, id+prevMaxId)}
实现这一点的一种方法是获取最大值(序列号),然后 与用于新数据的row_number()函数一起添加

这会起作用,但不会扩展,因为
行\u number()
需要将所有记录洗牌到一个分区中。我宁愿使用
单调地增加id()

如果要使用zipWithIndex,可以使用类似的方法:

//get max from "old" data
val prevMaxId = oldDf.select(max($"Sequence_number")).as[Long].head()    
val finalRDD = oldRdd.zipWithIndex().map{case (data,id) => (data, id+prevMaxId)}

我没有尝试单调地增加id,因为它不会给出id的连续增量。让我试试你给出的第二个选项。我没有尝试单调地增加id,因为它不会给出id的连续增量。让我试试你给出的第二个选项