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

时间:2018-10-15 15:56:00

标签: scala apache-spark apache-spark-sql

我正在使用import {NgModule} from '@angular/core'; import {AdvertisementComponent} from './advertisement.component'; @NgModule({ imports: [], declarations: [ AdvertisementComponent, ], exports: [ AdvertisementComponent, ], }) export class AdvertisementModule { } 生成zipWithIndex并将其添加为单独的列。 我正在使用类似于下面的代码:

sequence_number

我现在正试图提出一个用于增加负载的逻辑。 一个简单的加载,将新数据附加到现有数据上,并根据最后生成的编号生成序列号。

一种方法是通过获取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_number)函数。

但是还有其他方法可以在增量负载中使用row_number()吗? 一些代码会有所帮助。

我在Scala中使用Spark 2.3

1 个答案:

答案 0 :(得分:1)

  

通过获取max(Sequence_number)然后实现   与row_number()函数一起添加新数据。

这将起作用,但不能扩展,因为row_number()需要将所有记录改组为1个分区。我宁愿使用monotonically_increasing_id()

//get max from "old" data
val prevMaxId = oldDf.select(max($"Sequence_number")).as[Long].head()
val addUniqueID : Column = monotonically_increasing_id() + prevMaxId

val finalDF = newDF.withColumn("Sequence_number",addUniqueID)

如果您想使用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)}