记⼀次使⽤SPARK⽣成⾃增ID的解决⽅案
在这个项⽬中遇到的⼀个问题,由于数据库使⽤的是GREENPLUM,GREENPLUM提供的SPARK驱动是使⽤的先⽣成外部表,然后在使⽤INSERT 表名 SELECT * FROM 外部表的⽅式⽅法导⼊数据的。并且这种⽅式不⽀持⾃增ID。于是我们开始尝试使⽤SPARK或其他⽅式⽣成ID。
1、使⽤REDIS⽣成⾃增ID。
优点:使⽤REDIS的INCNY实现⾃增,并且没有并发问题,REDIS集环境完全可以满⾜要求。
缺点:因为每次都要去REDIS上取ID,SPARK与REDIS之间每次都是⼀次⽹络传输,少则10⼏ms,多则⼏百ms。⽽且SPARK与REDIS 形成了依赖关系。⼀旦REDIS挂了,SPARK就会出现问题。所以我们放弃了这个⽅案。
2、使⽤SPARKSQL的函数和withcolumn⽣成⾃增ID
val newDf = dataFrame.withColumn("id",org.apache.spark.w_number().over(Window.partitionBy(batch).orderBy(index))
由于上⾯的代码⽣成新的dataFrame,分区会变成⼀个,所以要转成RDD,重新repartition⼀下。
val newRdd = partition(10)
greenplum数据库val df = ateDataFrame(newRdd,schema)
由于有repartition操作,这⾥会出现shuffle。所以存在性能问题。对于我们要求⼤批量快速⼊库的要求不能满⾜。所以不能采⽤。
3、使⽤zipWithIndex在⽣成RDD[ROW]时⽣成ID
val tempRdd = rdd.zipWithIndex()
val record = tempRdd.map(x=>{
var strArray = x._1.split(",")
val newArray = strArray.+:(x._2).toString)
newArray
})
这个⽅案是参考了下⾯这个博客弄出来的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论