2017-04-05 1 views
0

をpysparkそれは次のように削減します。リオーダー列の値が

+-----+--------+-------+ 
| val | Feat1 | Feat2 | 
+-----+--------+-------+ 
| 1 | f1a | f2a | 
| 2 | f1a | f2b | 
| 8 | f1b | f2f | 
| 9 | f1a | f2d | 
| 4 | f1b | f2c | 
| 6 | f1b | f2a | 
| 1 | f1c | f2c | 
| 3 | f1c | f2g | 
| 9 | f1c | f2e | 
+-----+--------+-------+ 

私は賢明な次のような別のフィールドFeat1に基づいてグループ注文するval列が必要です。

+-----+--------+-------+ 
| val | Feat1 | Feat2 | 
+-----+--------+-------+ 
| 1 | f1a | f2a | 
| 2 | f1a | f2b | 
| 3 | f1a | f2d | 
| 1 | f1b | f2c | 
| 2 | f1b | f2a | 
| 3 | f1b | f2f | 
| 1 | f1c | f2c | 
| 2 | f1c | f2g | 
| 3 | f1c | f2e | 
+-----+--------+-------+ 

val値はFeat2の順序に依存しないが、代わりにBASを命じているNOTE元のval値で編集しました。

PySparkの列の値を必要に応じて並べ替えるコマンドはありますか?

Questionは同じものが存在しますが、SQL-Liteに特有のものです。

答えて

2
data = [(1, 'f1a', 'f2a'), 
(2, 'f1a', 'f2b'), 
(8, 'f1b', 'f2f'), 
(9, 'f1a', 'f2d'), 
(4, 'f1b', 'f2c'), 
(6, 'f1b', 'f2a'), 
(1, 'f1c', 'f2c'), 
(3, 'f1c', 'f2g'), 
(9, 'f1c', 'f2e')]    

table = sqlContext.createDataFrame(data, ['val', 'Feat1', 'Feat2']) 

編集:この目的のために、あなたがランク機能でウィンドウを使用することができます: `orderBy`は問題ではありません

from pyspark.sql import Window 
from pyspark.sql.functions import rank 

w = Window.partitionBy('Feat1').orderBy('val') 

table.withColumn('val', rank().over(w)).orderBy('Feat1').show() 
+---+-----+-----+ 
|val|Feat1|Feat2| 
+---+-----+-----+ 
| 1| f1a| f2a| 
| 2| f1a| f2b| 
| 3| f1a| f2d| 
| 1| f1b| f2c| 
| 2| f1b| f2a| 
| 3| f1b| f2f| 
| 1| f1c| f2c| 
| 2| f1c| f2g| 
| 3| f1c| f2e| 
+---+-----+-----+ 
+0

、質問で指摘したように主な要件は、私が必要とすることです'val'値は1、2、3 ...に初期化され、最初と同じに保たれません。 – Sarvesh

+0

あなたの要件を満たす場合は、この回答にマークを付けてください。 –

+0

ありがとう、これは正常に動作しています – Sarvesh