我在MySQL中执行此查询:
SELECT *,@a:=@a+1 AS rn FROM PERSON,(SELECT(@a:=0)) AS A
当我查询DataFrame时,我想知道如何通过spark sql执行此操作,如下所示:
val strSQL=" SELECT *,@a:=@a+1 AS rn FROM PERSON,(SELECT(@a:=0)) AS A"
sqlContext.sql(strSQL)
我的问题是,当我运行此代码时,控制台告诉我@a:= @ a + 1是错误的,我不知道如何用spark SQL类型编写SQL。
答案 0 :(得分:0)
如果要生成行号,可以使用函数
val schema = df.schema //data frame schema
//add rowNumberField
val rows = df.rdd.zipWithUniqueId.map{
case (r: Row, id: Long) => Row.fromSeq(id +: r.toSeq)}
Create DataFrame with schema
val dfWithPK = sqlContext.createDataFrame(
rows, StructType(StructField("rowMunber", LongType, false) +: schema.fields))
您还可以使用SQL函数生成行号
sqlContext.sql("select row_number() over (order by columnName) as rowNumber from Person")
或者您可以使用使用MontotonicallyIncreasingID方法生成唯一的行ID。
df.withColumn("RowNumber",monotonicallyIncreasingId)
希望这有帮助!