Python PySpark:在多列中计算值的最快方法

Python PySpark:在多列中计算值的最快方法,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我需要在几列中计算一个值,并且我希望列表中的每一列都有这些单独的计数 有没有更快/更好的方法?因为我的解决方案需要相当长的时间 dataframe.cache() list = [dataframe.filter(col(str(i)) == "value").count() for i in range(150)] 您可以执行条件计数聚合: import pyspark.sql.functions as F df2 = df.agg(*[ F.count(F.w

我需要在几列中计算一个值,并且我希望列表中的每一列都有这些单独的计数

有没有更快/更好的方法?因为我的解决方案需要相当长的时间

dataframe.cache()
list = [dataframe.filter(col(str(i)) == "value").count() for i in range(150)]

您可以执行条件计数聚合:

import pyspark.sql.functions as F

df2 = df.agg(*[
    F.count(F.when(F.col(str(i)) == "value", 1)).alias(i) 
    for i in range(150)
])

result = df2.toPandas().transpose()[0].tolist()

您可以尝试以下方法/设计

  • 为数据框的每一行编写一个映射函数,如下所示:
  • VALUE='VALUE'
    def行映射器(df行):
    返回[each==df_行中的每个值]
    
  • 为以两行作为输入的数据帧编写一个reduce函数:
  • def reduce_行(df_行1,df_行2):
    返回[x+y代表x,y在zip中(df_row1,df_row2)]
    

    注意:这些是简单的python函数,可以帮助您理解一些不能直接应用于PySpark的udf函数。

    您希望您的解决方案比我的更快吗?这甚至不是spark解决方案,所以我不认为soI甚至不理解第二个。@Dusty-是的,两种方法都不同!如果数据是以柱状方式存储和执行的,那么您的方法应该更快,如果数据是拼花地板或任何柱状格式或柱状数据存储,那么这是可能的。否则,我的方法更快,每一行只读取一次,而且非常简单。一个map和一个reduce操作。如果可能的话,请分享你的观点和统计数据。你希望你的解决方案比我的更快吗?我想应该是这样。请随时在您的数据上进行测试。谢谢。我试试看。