当前位置: 首页 > 知识库问答 >
问题:

Spark[重复]上的行明智计算

辛渝
2023-03-14

根据这个答案,我需要做一些逐行计算

result= (reduce(add, (<some row wise calculation on col(x)> for x in df.columns[1:])) / n).alias("result")

但在此之前,我需要按降序对行值进行排序(更改数据框中每行的列顺序?)假设我有以下行

 3,7,21,9
 5,15,10,2

例如,我需要知道每行每个值的排名(顺序),然后计算第一行的总和(值/索引)

21 ->4,9->3,7->3,3->1,sum(21/4,9/3,7/3,3/1)

第二排

15->4,10->3,5->2,2->1,sum(15/4,10/4,5/2,2/1)

不是重复的,因为我需要排序不是列,而是行

共有1个答案

司寇烨伟
2023-03-14

假设您的输入数据帧如下所示

+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|3   |7   |21  |9   |
|5   |15  |10  |2   |
+----+----+----+----+

然后,您可以编写一个udf函数,以获得所需的输出列

from pyspark.sql import functions as f
from pyspark.sql import types as t
def sortAndIndex(list):
    return sorted([(value, index+1) for index, value in enumerate(sorted(list))],  reverse=True)

sortAndIndexUdf = f.udf(sortAndIndex, t.ArrayType(t.StructType([t.StructField('key', t.IntegerType(), True), t.StructField('value', t.IntegerType(), True)])))

df.withColumn('sortedAndIndexed', sortAndIndexUdf(f.array([x for x in df.columns])))

这应该给你

+----+----+----+----+----------------------------------+
|col1|col2|col3|col4|sortedAndIndexed                  |
+----+----+----+----+----------------------------------+
|3   |7   |21  |9   |[[21, 4], [9, 3], [7, 2], [3, 1]] |
|5   |15  |10  |2   |[[15, 4], [10, 3], [5, 2], [2, 1]]|
+----+----+----+----+----------------------------------+

最新消息

你评论为

我的计算应该是sum(value/index),所以可能使用你的udf函数,我应该返回某种reduce(add,)?

你能做到的

from pyspark.sql import functions as f
from pyspark.sql import types as t
def divideAndSum(list):
    return sum([float(value)/(index+1) for index, value in enumerate(sorted(list))])

divideAndSumUdf = f.udf(divideAndSum, t.DoubleType())

df.withColumn('divideAndSum', divideAndSumUdf(f.array([x for x in df.columns])))

这应该给你

+----+----+----+----+------------------+
|col1|col2|col3|col4|divideAndSum      |
+----+----+----+----+------------------+
|3   |7   |21  |9   |14.75             |
|5   |15  |10  |2   |11.583333333333334|
+----+----+----+----+------------------+
 类似资料:
  • 问题内容: Eclipse 3.5具有一个非常好的功能,可以生成Java hashCode()函数。例如,它将生成(略微缩短:) (如果类中具有更多属性,则为每个其他属性重复此操作。对于ints,可以省略.hashCode()。) 这似乎很好,但是对于首选的31。它可能取自JavaString的hashCode实现,出于性能原因而使用该特性,在引入硬件乘法器之后就已经不复存在了。在这里,对于i和j

  • 数据: 法典: 直方图模式: 例外: 虽然我明白为什么会发生这种情况,但我不知道如何解决这个问题。数据集是从数据库中的表创建的,可以包含任意数量的具有任意名称的列,包括< code>count 、< code>avg和其他“保留”字。 任何帮助。

  • 我很好奇,在声明ArrayList时,这样做有什么区别: 这是: i、 e.未声明<代码>

  • 为什么第一次计算的结果比第二次计算的结果大? 结果:

  • 我已经尝试了很多不同的例子,但我不能使它工作。代码有问题,我总是以 我从那个问题中得到了启发,就这样做了: 我的表:user_groups 我想要的是数字2,因为用户是组NR1的一部分,这是会话组ID。 当我只在SQL中执行查询时:

  • 当我在< code>themes_holo.xml(一个Android系统的文件)中找到声明时,Intellij告诉我: 找不到要转到的声明 下面是提到的代码: