Python pyspark数据帧中的分布式for循环

Python pyspark数据帧中的分布式for循环,python,pandas,parallel-processing,pyspark,aggregate-functions,Python,Pandas,Parallel Processing,Pyspark,Aggregate Functions,上下文:我的公司在Spark 2.2中,因此不可能用于分布式列处理 我有包含数千列(功能)和数百万条记录的数据帧 df = spark.createDataFrame([(1,"AB", 100, 200,1), (2, "AC", 150,200,2), (3,"AD", 80,150,0)],["Id","Region","Salary", "HouseHoldIncome", "NumChild"]) 我想以平行的方式对每一列进行一些总结和统计,并想知道实现这一点的最佳方法是什么 #Th

上下文:我的公司在Spark 2.2中,因此不可能用于分布式列处理

我有包含数千列(功能)和数百万条记录的数据帧

df = spark.createDataFrame([(1,"AB", 100, 200,1), (2, "AC", 150,200,2), (3,"AD", 80,150,0)],["Id","Region","Salary", "HouseHoldIncome", "NumChild"])
我想以平行的方式对每一列进行一些总结和统计,并想知道实现这一点的最佳方法是什么

#The point is any kind of customized summary can exist in my stat1, acting on a Spark dataframe to exploit the distributed processing; of one single column
def stat1(df_1_col):
   if (datatype is not numeric):
      return "NA"
   max_df = df_1_col.groupby().max().collect()
   if (max_df >50):
     return df_1_col.map(....).reduceByKey(...)
   else:
     return get_1st_decile(df_1_col)/df_1_col.agg(mean())
我想实现

+-------+------------------+-------------------+--------------------+
    |col_name|            stat1|       stat2|            stat3|
    +-------+------------------+-------------------+--------------------+
    |  Id|                10|                 10|                  10|
    |Salary|               4.5| 0.5215336029384192|-0.01309370117407197|
    | HouseholdIncome|2.8722813232690143|  0.229328162820653|  0.5756058014772729|
     +-------+------------------+-------------------+--------------------+
以下是我的问题:

1/我如何在没有pandas_udf的情况下实现这种分布式处理

2/在更糟糕的情况下,我需要使用for循环

   col_list = ["Id","Salary", "HouseHoldIncome", "NumChild"]
        for col in col_list:
          ....#how to call stat1[col] properly and collect to final result
我们应该如何恰当地编写它来实现上述形式。据我所知,
.withColumn()
和udf不能在这里使用,因为它需要collect_list将我的列数据帧展平到list,并失去Spark DF的并行处理能力;更不用说我在1000万张唱片上试过收集名单,名单太多了,无法处理

.groupBy().agg(stat1_udf(collect_list('data')).alias('data'))

3/如果我们必须使用for循环,Spark会并行处理所有列吗? 根据,跨列的for循环仍然可以并行处理!但据我所知,这是可行的,因为它是按行的,只涉及转换。所以我们可以说,在for循环步骤中,行变换只添加到DAG中,没有任何求值。因此,我们在DAG中“准备”了df_col1->转换(df_col_1)、df_col2->转换(df_col_2)等。在操作步骤中,这些将由Spark master分发并并行处理

然而,在我的例子中,它是一个需要reduce、sum、mean或一些collect等的摘要,因此在下一个循环/列出现之前,每个循环/列都必须求值。DAG不能等待,但必须执行df_col1->Transformation_and_Action(df_col_1)->df_col2->Transformation_and_Action(df_col_2),使其在数千列上连续运行


有没有接受者?

因为你在这里应用了全局聚合,矢量化的UDF对你没有任何用处-没有专门为这种操作设计的。此外,还不清楚为什么需要用户定义的函数——Spark提供了大量现成的描述性统计数据。尽管如此,如果这些对您不起作用,您应该使用适当的Scala聚合,或者减少RDD操作。因为您在这里应用全局聚合,矢量化的UDF对您没有任何用处-没有为此类操作而设计的。此外,还不清楚为什么需要用户定义的函数——Spark提供了大量现成的描述性统计数据。尽管如此,如果这些不适合您,您应该使用适当的Scala聚合,或者减少RDD操作。