2016-10-30 4 views
2

Чтобы ранжировать, мне нужно, чтобы row_number был фреймворком pyspark. Я видел, что в функции windows pyspark есть функция row_number, но это требует использования HiveContext.Как получить row_number является pyspark dataframe

Я попытался заменить sqlContext с HiveContext

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

Но теперь бросает исключение 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, если ваши данные отсутствуют в Hive. Вы можете просто продолжить свой 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

Я добавил некоторые подробности. Надеюсь, теперь ясно –

Смежные вопросы