如何在pyspark数据框列上拟合核心密度估算,并使用它来创建包含估算

时间:2018-03-08 11:10:58

标签: pyspark kernel-density

我的用法如下。考虑我有一个pyspark数据帧,其格式如下: df.columns: 1. hh:包含一天中的小时(类型为int) 2. userId:一些唯一标识符。

我想要做的是想弄清楚在页面上有异常点击的userId列表。所以我先做一个groupby: DF = df.groupby(" HH""用户id).Count之间()别名(" LoginCounts)。

现在数据框的格式为: 嗯 2. userId 3.LoginCounts:特定用户在特定时刻登录的次数。

我想使用pyspark kde函数,如下所示:

from pyspark.mllib.stat import KernelDensity
kd=KernelDensity()
kd.setSample(df.select("LoginCounts").rdd)
kd.estimate([13.0,14.0]).

我收到错误: Py4JJavaError:调用o647.estimateKernelDensity时发生错误。 :org.apache.spark.SparkException:作业由于阶段失败而中止

现在我的最终目标是让kde在基于一天的时间基础上输入数据,然后使用第二天的数据来获得每个登录计数的概率估计值。 例如:我想实现这种性质:

df.withColumn("kdeProbs",kde.estimate(col("LoginCounts)))

因此列kdeProbs将包含P(LoginCount = x |估计kde)。

我已经尝试过搜索相同的示例,但我总是被重定向到spark.apache.org页面上的标准kde示例,但这并没有解决我的问题。

1 个答案:

答案 0 :(得分:0)

仅选择一列并将其转换为RDD是不够的;您还需要在该列中选择实际数据才能正常工作。试试这个:

from pyspark.mllib.stat import KernelDensity

dat_rdd = df.select("LoginCounts").rdd

# actually select data from RDD
dat_rdd_data = dat_rdd.map(lambda x: x[0])

kd = KernelDensity()
kd.setSample(dat_rdd_data)
kd.estimate([13.0,14.0])