2016-10-30 29 views
2

ランク付けするために、私はrow_numberを取得する必要がpysparkデータフレームです。 pysparkのwindows関数にrow_number関数があることがわかりましたが、これはHiveContextを使う必要があります。 row_numberを取得する方法は、pysparkデータフレームです

は私がHiveContext

 import pyspark 
     self.sc = pyspark.SparkContext() 
     #self.sqlContext = pyspark.sql.SQLContext(self.sc) 
     self.sqlContext = pyspark.sql.HiveContext(self.sc) 

でsqlContextを交換しようとしたが、それは今、例外TypeError例外がスローされます:「JAVAPACKAGE」オブジェクトが呼び出すことはできません はあなたがいずれかのオペレーティングHiveContextに助けることができるかの行番号を取得します別の方法ですか?

データの例: 私は最初の予測でランク付けしてから、この順位に基づいて損失関数(ndcg)を計算します。損失関数を計算するために、私はランキング(すなわち、ソートにおける予測の位置)を無視します。

最初のステップはデータをpredでソートすることですが、ソートされたデータの実行カウンタが必要です。

+-----+--------------------+ 
|label|pred| 
+-----+--------------------+ 

| 1.0|[0.25313606997906...| 
| 0.0|[0.40893413256608...| 
| 0.0|[0.18353492079000...| 
| 0.0|[0.77719741215204...| 
| 1.0|[0.62766290642569...| 
| 1.0|[0.40893413256608...| 
| 1.0|[0.63084085591913...| 
| 0.0|[0.77719741215204...| 
| 1.0|[0.36752166787523...| 
| 0.0|[0.40893413256608...| 
| 1.0|[0.25528507573737...| 
| 1.0|[0.25313606997906...| 

ありがとうございます。

答えて

1

データがハイブに存在しない場合はHiveContextを作成する必要はありません。あなたはsqlContextで続行できます。

作成しない限り、データフレームにはrow_numberはありません。 pyspark.sql.functions.row_number `は別の目的のためであり、ウィンドウ分割されたパーティションでのみ動作します。

row_idとして新しい列を作成し、monotonically_increasing_idを使用して後で照会することが必要な場合があります。

from pyspark.sql.functions import monotonically_increasing_id 
from pyspark.sql.types import Row 

data = sc.parallelize([ 
    Row(key=1, val='a'), 
    Row(key=2, val='b'), 
    Row(key=3, val='c'), 
]).toDF() 

data = data.withColumn(
    'row_id', 
    monotonically_increasing_id() 
) 

data.collect() 


Out[8]: 
[Row(key=1, val=u'a', row_id=17179869184), 
Row(key=2, val=u'b', row_id=42949672960), 
Row(key=3, val=u'c', row_id=60129542144)] 
+0

私はmonotonically_increasing_id()を見ましたが、これは私が必要なものではありません。私は各行の相対ランキングが必要です。より具体的には、列の値*の位置を合計する必要があります。 –

+0

データサンプルを提供すると、この質問はよりよく理解できます。 – ShuaiYuan

+0

私はいくつかの詳細を追加しました。今はっきりしていることを願って –

関連する問題