2017-05-02 11 views
3

た後、私はこの単純なPySparkコードスニペットの振る舞いを理解していない:PySpark 1.6.2 |収集()のOrderBy /並べ替え

# Create simple test dataframe 
l = [('Alice', 1),('Pierre', 3),('Jack', 5), ('Paul', 2)] 
df_test = sqlcontext.createDataFrame(l, ['name', 'age']) 

# Perform filter then Take 2 oldest 
df_test = df_test.sort('age', ascending=False)\ 
      .filter('age < 4') \ 
      .limit(2) 


df_test.show(2) 
# This outputs as expected : 
# +------+---+ 
# | name|age| 
# +------+---+ 
# |Pierre| 3| 
# | Paul| 2| 
# +------+---+ 

df_test.collect() 
# This outputs unexpectedly : 
# [Row(name=u'Pierre', age=3), Row(name=u'Alice', age=1)] 

これはコレクト()関数の予想される動作ですか?正しい順序を維持するリストとして列を取得するにはどうすればよいですか?

おかげ

+1

を解決するために、ソータUDFを使用する必要がありました。あなたが投稿したコードを実行したところ、期待通りの結果が得られました。 '[Row(name = u'Pierre '、age = 3)、Row(name = u'Paul'、age = 2)]' – Tim

+0

(sqlcontext = HiveContext(sc) 'を最初に追加するのを忘れてしまいました)、同じ結果が得られました。スパークの設置に何か問題がありますか? – hyperc54

+3

'sort'の前に' filter'を実行してください。不要な行のソートや 'sort'の代わりに' orderBy'を試してみることになります。 – Pushkr

答えて

0

は、私はあなたが実際に走ったコードを投稿していなかったこの問題に

def sorter(l): 
    import operator 
    res = sorted(l, key =operator.itemgetter(0)) 
    L1=[item[1] for item in res] 
    #return " ".join(str(x) for x in L) 
    return "".join(L1) 

sort_udf = udf(sorter) 
関連する問題