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

如何计算pyspark中每行某些列的最大值

刘翔宇
2023-03-14
问题内容

我在pyspark中使用sqlContext.sql函数读取了一个数据框。它包含4个数字列,每个客户都有信息(这是键ID)。我需要计算每个客户端的最大值并将此值加入数据框:

+--------+-------+-------+-------+-------+
|ClientId|m_ant21|m_ant22|m_ant23|m_ant24|
+--------+-------+-------+-------+-------+
|       0|   null|   null|   null|   null|
|       1|   null|   null|   null|   null|
|       2|   null|   null|   null|   null|
|       3|   null|   null|   null|   null|
|       4|   null|   null|   null|   null|
|       5|   null|   null|   null|   null|
|       6|     23|     13|     17|      8|
|       7|   null|   null|   null|   null|
|       8|   null|   null|   null|   null|
|       9|   null|   null|   null|   null|
|      10|     34|      2|      4|      0|
|      11|      0|      0|      0|      0|
|      12|      0|      0|      0|      0|
|      13|      0|      0|     30|      0|
|      14|   null|   null|   null|   null|
|      15|   null|   null|   null|   null|
|      16|     37|     29|     29|     29|
|      17|      0|      0|     16|      0|
|      18|      0|      0|      0|      0|
|      19|   null|   null|   null|   null|
+--------+-------+-------+-------+-------+

在这种情况下,客户端“ six”的最大值为23,而客户端“ ten”的最大值为30。“ null”在新列中自然为null。

请帮助我显示如何执行此操作。


问题答案:

我认为将值组合到列表中而不是找到最大值将是最简单的方法。

from pyspark.sql.types import *

schema = StructType([
    StructField("ClientId", IntegerType(), True),
    StructField("m_ant21", IntegerType(), True),
    StructField("m_ant22", IntegerType(), True),
    StructField("m_ant23", IntegerType(), True),
    StructField("m_ant24", IntegerType(), True)
])

df = spark\
    .createDataFrame(
        data=[(0, None, None, None, None),
             (1, 23, 13, 17, 99),
             (2, 0, 0, 0, 1),
             (3, 0, None, 1, 0)],
        schema=schema)

import pyspark.sql.functions as F

def agg_to_list(m21,m22,m23,m24):
    return [m21,m22,m23,m24]

u_agg_to_list = F.udf(agg_to_list, ArrayType(IntegerType()))

df2 = df.withColumn('all_values', u_agg_to_list('m_ant21', 'm_ant22', 'm_ant23', 'm_ant24'))\
        .withColumn('max', F.sort_array("all_values", False)[0])\
        .select('ClientId', 'max')

df2.show()

输出:

+--------+----+
|ClientId|max |
+--------+----+
|0       |null|
|1       |99  |
|2       |1   |
|3       |1   |
+--------+----+


 类似资料:
  • 我有一个pyspark数据框,在这里我可以找到每列的最小/最大值和最小/最大值计数。我可以使用: 我希望在同一数据帧中也有最小/最大值的计数。我需要的具体输出: …|col|n|col|m| …|xn | xm |。。。最小值(col(coln)) 计数(col_n==xn)|计数(col_m==xm)|。。。

  • 问题内容: 我想为每一行计算最大列子集,并将其添加为现有列的新列。 我以非常尴尬的方式做到了这一点: 该功能的工作原理是: 返回: 我认为,如果可以使用带有的用户定义函数,则可以更简单地完成。但是我不知道该怎么做。如果您有更简单的方法来实现这一目标,请告诉我。我正在使用Spark 1.6 问题答案: 让我们从几个导入开始 接下来定义负无穷大字面量: 映射列并将结果传递给: 最后: 结果: 您可以将

  • 我有一个pyspark数据框架,在这个数据框架上,我对多类数据应用了随机分类器模型(来自py spark . ml . classification import RandomForestClassifier)。 现在,我有预测和概率列(密集向量列)。我想要一个新列中的单个最高概率,它来自与预测相对应的可用概率列。你能告诉我一条路吗?

  • 问题内容: 如果我有一个数组,我想检查数组中有多少个。在JavaScript中不使用循环循环的最优雅的方法是什么? 问题答案: 很简单:

  • 假设我有下面的。我想组合价格列和值列,以便所有价格都在一列中,所有卷都在另一列中。我还想要标识价格级别的第三列。例如,、和。 这就是最终的df应该是什么样子: 我尝试使用,我认为几乎有正确的答案。 这就是熔融时部分df的样子: 上面的问题是,数量和价格在同一列中,但我希望它们在两个单独的列中。 我使用了正确的函数吗?

  • 问题内容: 我有一个像这样的数据框(df): 如果具有肯定/相同和行,则这些行位于同一块中。在这种情况下,带有的行。我想将行拆分为块,并计算该块中的行数。如果行的长度不是6,则删除整个块,否则,保留该块。 我的粗略代码: 预期输出: 谢谢! 问题答案: 我认为,在和没有S,所以使用+ : 详情: 不幸的是真的很慢,因此如果需要更好的性能,请使用: 警告 给定组数,结果不能解决性能问题,这对于其中一