Skip to main content
 首页 » 编程设计

python之如何获取 row_number 是 pyspark 数据框

2024年08月21日43pengyingh

为了排名,我需要获取 row_number 是一个 pyspark 数据框。我看到 pyspark 的 windows 函数中有 row_number 函数,但这需要使用 HiveContext。

我尝试用 HiveContext 替换 sqlContext

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

但它现在抛出异常 TypeError: 'JavaPackage' object is not callable 您能否帮助操作 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...| 

谢谢。

请您参考如下方法:

您不需要创建 HiveContext如果您的数据不在 Hive 中。您可以继续使用 sqlContext。

除非您创建数据框,否则没有row_number。 pyspark.sql.functions.row_number ` 用于不同的目的,它仅适用于窗口分区。

您可能需要使用 monotonically_increasing_id 创建一个新列作为 row_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)]