当我通过查询添加cloumn自动增加时,如何通过spark SQL进行查询

时间:2017-05-22 08:29:26

标签: sql apache-spark dataframe rdd

我在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。

1 个答案:

答案 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)

希望这有帮助!