2017-05-22 40 views
1

我做這個查詢在MySQL這樣添加cloumn自動增加:我如何通過火花SQL做查詢時,我通過查詢

SELECT *,@a:[email protected]+1 AS rn FROM PERSON,(SELECT(@a:=0)) AS A 

我想知道我怎麼能火花SQL當我詢問這樣做一個數據幀,這樣類型:

val strSQL=" SELECT *,@a:[email protected]+1 AS rn FROM PERSON,(SELECT(@a:=0)) AS A" 
sqlContext.sql(strSQL) 

我的問題是,當我運行此代碼,控制檯告訴我@a:= @ A + 1是錯的,我不knwon如何編寫SQL火花的SQL類型。

+0

你想模仿Rownum或LAG?如果是的話,窗口功能已經在Spark中實現。 – philantrovert

+0

什麼是@a:= @ a + 1? – mtoto

+0

是的,我想生成Rownum – lee

回答

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 methodto產生獨特的行ID。

df.withColumn("RowNumber",monotonicallyIncreasingId) 

希望這會有所幫助!

+0

這裏要指出的是,'monotonicallyIncreasingID'按遞增順序生成非確定性值。不完全是OP想要的。 – philantrovert