当前位置: 首页 > 面试题库 >

比较Pyspark中的列

夏侯俊美
2023-03-14
问题内容

我正在与n列的PySpark DataFrame。我有一组m列(m <n),我的任务是选择其中包含最大值的列。

例如:

输入:PySpark DataFrame包含:

col_1 = [1,2,3], col_2 = [2,1,4], col_3 = [3,2,5]

Ouput:

col_4 = max(col1, col_2, col_3) = [3,2,5]

在PySpark中有什么方法可以执行此操作,还是应该将PySpark df转换为Pandas df,然后执行操作?


问题答案:

您可以减少在列列表中使用SQL表达式:

from pyspark.sql.functions import max as max_, col, when
from functools import reduce

def row_max(*cols):
    return reduce(
        lambda x, y: when(x > y, x).otherwise(y),
        [col(c) if isinstance(c, str) else c for c in cols]
    )

df = (sc.parallelize([(1, 2, 3), (2, 1, 2), (3, 4, 5)])
    .toDF(["a", "b", "c"]))

df.select(row_max("a", "b", "c").alias("max")))

Spark 1.5+还提供leastgreatest

from pyspark.sql.functions import greatest

df.select(greatest("a", "b", "c"))

如果要保留最大名称,可以使用`structs:

from pyspark.sql.functions import struct, lit

def row_max_with_name(*cols):
    cols_ = [struct(col(c).alias("value"), lit(c).alias("col")) for c in cols]
    return greatest(*cols_).alias("greatest({0})".format(",".join(cols)))

 maxs = df.select(row_max_with_name("a", "b", "c").alias("maxs"))

最后,您可以使用上面的内容来选择“顶部”列:

from pyspark.sql.functions import max

((_, c), ) = (maxs
    .groupBy(col("maxs")["col"].alias("col"))
    .count()
    .agg(max(struct(col("count"), col("col"))))
    .first())

df.select(c)


 类似资料:
  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • 我在pyspark有两个数据框。如下所示,df1保存来自传感器的整个long_lat。第二个数据帧df2是第一个数据帧的子集,其中lat-long值被向上舍入到2位小数,然后删除重复项以保留唯一的lat_long数据点。 DF1: df2: 因此,df2 的行数比第一个少得多。在 df2 中,我应用了一个 udf 来计算状态名称。 现在我想在 df1 中填充状态名称。由于 df2 的 lat_lo

  • Java在进行比较时抛出的错误是: 然后比较的方法(比较器 你知道发生了什么事吗?

  • 我正在用我的“CsvReader”读取csv文件,如下所示: 我使用的csv如下所示: 雇员的dataVO看起来像 包com。cg。dto; 公营雇员{ 字符串empId; 字符串名称; 薪酬; 公共字符串getEmpId(){ 返回empId; } public void setEmpId(字符串empId){ 这empId=empId; } 公共字符串 返回empName; } public

  • 问题内容: 我正在尝试使用C#代码比较两个Xml文件。我想忽略Xml语法差异(即前缀名称)。为此,我使用了Microsoft的XML Diff和Patch C#API。它适用于某些Xml,但我找不到配置它以与以下两个Xml一起使用的方法: XML A: XML B: 我的问题是: 我对这两个xml在语义上相等(或同构)是否正确? 可以配置Microsoft的XML Diff和Patch API来支

  • 嗨,我需要打印我的最高工资的人的方法。我有女巫雇员和女巫学生名单。当学生的平均成绩在4.5分以上时,他可以得到500英镑的薪水。 我有这样方法: 这是Person类: 这是学生课堂: 我需要的方法为最好的支付的人和方法总和所有人的收入。