根据pyspark中的整列计算统计数据

时间:2018-02-15 08:11:17

标签: apache-spark statistics pyspark

我尝试使用 <div *ngIf="!person.colors"> <p>{{person.name}} has no colors</p> </div> 注释将分布拟合到PySpark中的整个列。

Spark将列拆分为较小的块,因此我无法将分布设置为基于整个总体(此列的所有值)。

这是我使用的代码:

pandas_udf

结果:

from pyspark.sql import Row
import pandas as pd
import numpy as np
import scipy.stats as st
l = [('a',0),('b',0.1),('c',0.2),('d',0.3),('e',0.4),('f',0.5)]
rdd = sc.parallelize(l)
rdd2 = rdd.map(lambda x: Row(name=x[0], val=float(x[1])))
dataframe = sqlContext.createDataFrame(rdd2)


@pandas_udf('float')
def expon_cdf_udf(x):
  loc,scale = st.expon.fit(x)
  return pd.Series(st.expon.cdf(x, loc = loc,scale = scale))

dataframe = dataframe.withColumn("CDF",expon_cdf_udf(dataframe['val']))

display(dataframe)

我得到的结果是基于部分人口而不是整个载体。例如,spark会尝试一次将分布拟合为一个值,结果显然是错误的。

有没有办法限制火花在整个列上运行?我知道它不可扩展,但在我的案例中没有任何选项。

1 个答案:

答案 0 :(得分:1)

TL; DR 这不是设计-1.00000 0.000000 0.010000 0.100000 0.500000 00000000 1.000000 1.500000 10.00000 10.50000 100.0000 1000.000 1001.000 1006.000 NULL NULL 的用例。

  

有没有办法限制火花在整个列上运行?我知道它不可扩展,但在我的情况下没有任何选项。

当然可以

  • 使用pandas_udf收集所有数据并在结果上运行您的功能。
  • toPandas并在结果上运行coalesce(1)
  • 将分组变量与pandas_udf一起使用,并在结果上运行函数。

但如果你做了其中任何一项,你可以从一开始就选择Pandas。如果可以,那就去做吧,不要浪费时间去攻击Spark。

相关问题