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的连续增量。让我试试你给出的第二个选项