2017-02-16 8 views
0

私はスパークするのが初めてで、大きなデータセット用のrownumerを作成しようとしています。 私はpartitionBy節を使用していないので、うまく動作するrow_numberウィンドウ関数を使用しようとしましたが、効率的ではありません。oracle rownumに似たSpark DataframeでRownum機能を実現するには

例:

val df= Seq(
     ("041", false), 
     ("042", false), 
     ("043", false) 
    ).toDF("id", "flag") 

結果は次のようになります。現在、私は

df.withColumn("rownum",row_number().over(Window.orderBy($"id"))) 

を使用しています

val df= Seq(
     ("041", false,1), 
     ("042", false,2), 
     ("043", false,3) 
    ).toDF("id", "flag","rownum") 

は、ウィンドウ関数を使用せず、この結果を達成するための他の方法はありますか? 私はまた、あなたはインデックスが1つの追加、1でインデックスを開始する0

を開始すると、ここで

val df2 = df.withColumn("rownum",monotonicallyIncreasingId)

たrowNum機能を取得するためにmonotonicallyIncreasingIdを使用することができますmonotonicallyIncresingIDとZipwithIndex

答えて

1

を試してみました+1 to the monotonicallyIncreasingId

val df2 = df.withColumn("rownum",monotonicallyIncreasingId+1)

scala> val df2 = df.withColumn("rownum",monotonicallyIncreasingId) 
df2: org.apache.spark.sql.DataFrame = [id: string, flag: boolean, rownum: bigint] 

scala> df2.show 
+---+-----+------+ 
| id| flag|rownum| 
+---+-----+------+ 
|041|false|  0| 
|042|false|  1| 
|043|false|  2| 
+---+-----+------+ 


scala> val df2 = df.withColumn("rownum",monotonicallyIncreasingId) 
df2: org.apache.spark.sql.DataFrame = [id: string, flag: boolean, rownum: bigint] 

scala> df2.show 
+---+-----+------+ 
| id| flag|rownum| 
+---+-----+------+ 
|041|false|  0| 
|042|false|  1| 
|043|false|  2| 
+---+-----+------+ 


scala> val df2 = df.withColumn("rownum",monotonicallyIncreasingId) 
df2: org.apache.spark.sql.DataFrame = [id: string, flag: boolean, rownum: bigint] 

scala> df2.show 
+---+-----+------+ 
| id| flag|rownum| 
+---+-----+------+ 
|041|false|  0| 
|042|false|  1| 
|043|false|  2| 
+---+-----+------+ 


scala> var df2 = df.withColumn("rownum",monotonicallyIncreasingId) 
df2: org.apache.spark.sql.DataFrame = [id: string, flag: boolean, rownum: bigint] 

scala> df2.show 
+---+-----+------+ 
| id| flag|rownum| 
+---+-----+------+ 
|041|false|  0| 
|042|false|  1| 
|043|false|  2| 
+---+-----+------+ 


scala> df2 = df.withColumn("rownum",monotonicallyIncreasingId) 
df2: org.apache.spark.sql.DataFrame = [id: string, flag: boolean, rownum: bigint] 

scala> df2.show 
+---+-----+------+ 
| id| flag|rownum| 
+---+-----+------+ 
|041|false|  0| 
|042|false|  1| 
|043|false|  2| 
+---+-----+------+ 
+0

"monotonicallyIncreasingId"は、複数回実行すると乱数を生成しますが、0または1から世代が発生することはありません。 – drlol

+0

他の方法は、データフレームを 'RDD'に変換し、zipWithIndex関数を使用することです。 http://stackoverflow.com/questions/23939153/how-to-assign-unique-contiguous-numbers-to-elements-in-a-spark-rdd –

+0

https://issues.apache.org/jira/browse/ SPARK-3098:これを読んで、 これはまた、目的を果たしていません..ありがとう!! – drlol