32.
如何在spark Sql里 创建自增id字段,作为主键?
参考了很多Spark的RDD原生函数,比如zip(),zipWithIndex(),自增id,效率不高。尤其是DataFram转换成RDD,再用zipWithIndex()效率低下。下面我给出一个我认为比较合理的方法,借用row_number函数实现。
下面列出我的伪代码:
下面给出示例:
import org.apache.spark.sql.expressions.Window
/* Case: 1
df是一个DataFrame
需要为其建立主键
withColumn与row_number函数结合的方式完成
**/
df.withColumn("id",row_number.over(Window.partitionBy(lit(1)).orderBy(lit(1))).cast(LongType))
/* Case: 2
df是一个DataFrame
如果是在存量数据基础上再自增主键id
withColumn与row_number函数结合的方式完成
**/
//求当前df的最大id
var maxID = ss.sql("select if(max(id) is null, 0, max(id)) from XXXX").collect()(0)
var maxID_ = maxID(0).toString().toLong
// 在row_number()函数基础上,再加上 maxID_即可
df.withColumn("id",row_number.over(Window.partitionBy(lit(1)).orderBy(lit(1))).cast(LongType)+lit(maxID_))
此贴来自汇总贴的子问题,只是为了方便查询。
总贴请看置顶帖:
pyspark及Spark报错问题汇总及某些函数用法。
https://blog.youkuaiyun.com/qq0719/article/details/86003435