Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyspark针对每一行对其他行进行计算,并获得最大值_Python_Apache Spark_Pyspark - Fatal编程技术网

Python pyspark针对每一行对其他行进行计算,并获得最大值

Python pyspark针对每一行对其他行进行计算,并获得最大值,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我想针对表中的每一行对每一行进行一些计算,然后将最大值保留在一个新列中 例如,我想为以下数据帧中的每一行计算x/x*y: id分数 A 1.2 B 4.5 C 0.8 D 1.1 E 6.7 A将使用所有其他行B、C、D、E进行计算 这类似于执行嵌套for循环: forint i=0;i

我想针对表中的每一行对每一行进行一些计算,然后将最大值保留在一个新列中

例如,我想为以下数据帧中的每一行计算x/x*y:

id分数 A 1.2 B 4.5 C 0.8 D 1.1 E 6.7 A将使用所有其他行B、C、D、E进行计算

这类似于执行嵌套for循环:

forint i=0;i最大分数\u当前\u 最大分数当前值=结果 这是预期的输出。公式为x/x*y

id得分最大值 A 1.2 1.25,因为最大值为0.2 A-B、1.25 A-C、0.9 A-D B 4.5 1.25 0.83 B-A、1.25 B-C、0.91 B-D C 0.80.90.83 C-A、0.2 C-B、0.9 C-D D 1.1 1.25 0.83 D-A、0.2 D-B、1.25 D-C
我不知道如何在pyspark中实现这一点。

因为根据我的理解,您希望将每一行与每一行进行比较,所以唯一的选择是笛卡尔乘积。您可以使用以下代码执行此操作:

创建输入数据 df=spark.createDataFrame [A',1.2',B',4.5',C',0.8',D',1.1',E',6.7], ['id','score'] 为清晰起见重命名列 df2=df。选择df['id']。别名'id2',df['score']。别名'score2' 并使用交叉连接函数笛卡尔积 从pyspark.sql导入函数为F df\ .交叉连接2\ .其中f.col'id'!=F.col'id2'\ .withColumnresult,F.col'score'/F.col'score'*F.col'score2'\ .groupByid,得分\ .aggF.maxF.col'result'.aliasmax\ .orderByid.show 这将产生:

+--+---+---------+ |id |得分|最高| +--+---+---------+ |A | 1.2 | 1.25| |B | 4.5 | 1.25| |C | 0.8 | 0.9091| |D | 1.1 | 1.25| |E | 6.7 | 1.25| +--+---+---------+ 编辑 如果您想知道哪个id产生了最大的结果,可以像下面这样使用struct函数:

df\ .交叉连接2\ .其中f.col'id'!=F.col'id2'\ .withColumnresult,F.col'score'/F.col'score'*F.col'score2'\ .withColumns,F.structF.col'result',F.col'id2'\ .groupByid,得分\ .aggF.maxF.col's'.alias's'\ 。选择“id”、“分数”、“F.col的结果”。别名“max”, F.col's.id2'。别名'id2'\ .orderBy'id'。显示
添加预期输出并更详细地解释您的问题更新了问题是否有办法显示为每行生成最大分数的id?是的,您可以使用包含分数和id的窗口或结构,以便将它们聚合在一起。类似于T.StructType[T.StructField'id',T.StringType,True,T.StructField'score',T.DoubleType,True]?你能把它也写进你的答案吗?谢谢!