记一次使用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.sql.functions.row_number().over(Window.partitionBy(batch).orderBy(index))

     由于上面的代码生成新的dataFrame,分区会变成一个,所以要转成RDD,重新repartition一下。

val newRdd = newDf.rdd.repartition(10)
val df = session.createDataFrame(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

})

这个方案是参考了下面这个博客弄出来的

 

scala spark dataframe添加序号(id)列

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值