Pyspark用户定义的列聚合计算

Pyspark用户定义的列聚合计算,pyspark,apache-spark-sql,pyspark-sql,sklearn-pandas,Pyspark,Apache Spark Sql,Pyspark Sql,Sklearn Pandas,我正在为Pyspark中的分类器准备输入数据。我一直在SparkSQL中使用聚合函数来提取平均值和方差等特征。它们按活动、名称和窗口进行分组。窗口的计算方法是将unix时间戳除以10000,分成10秒的时间窗口 sample=sqlContext.sqlSELECT活动、名称、窗口、avgacc_x作为avgX、varianceacc_x作为varX从数据组中按活动、名称、窗口顺序、名称、窗口 这样做的结果看起来像 Activity Name Window AvgX

我正在为Pyspark中的分类器准备输入数据。我一直在SparkSQL中使用聚合函数来提取平均值和方差等特征。它们按活动、名称和窗口进行分组。窗口的计算方法是将unix时间戳除以10000,分成10秒的时间窗口

sample=sqlContext.sqlSELECT活动、名称、窗口、avgacc_x作为avgX、varianceacc_x作为varX从数据组中按活动、名称、窗口顺序、名称、窗口 这样做的结果看起来像

Activity  Name         Window       AvgX       VarX
Walk    accelerometer  95875        2.0          1.0
我现在想做的是计算X上每个点的平均斜率

为此,我需要时间戳、窗口和X。我已经用Python实现了逻辑,使用数组,这就是它的样子——计算每个点之间的斜率,然后得到平均斜率。理想情况下,我希望在UDAF中实现这一点,Pyspark还不支持UDAF。它看起来是这样的,假设下面的函数叫做斜率。然后在sql中,您可以将slopetimestamp,X作为avgSlopeX来执行

编辑-更改输入,使其更清晰。 所以,我要做的就是计算每个点之间的斜率,然后返回窗口中斜率的平均值。所以,当我得到每个窗口的平均值和方差时,我也想得到平均斜率

样本输入 时间戳=[14647034255441464703426534146470342755114644703428587146470342951214647034304931464703431505146470343254314647034335131464703434529] 值=[1021.311021.261021.191021.191021.11021.11021.1191021.051021.02] i=0; 斜率=0.0; 总斜率=0.0; 而i我如何实现这一点?我是否应该尝试先转换为熊猫数据帧,然后再转换为numpy数组?如果是这样,我如何确保数据仍然正确映射,同时记住sql查询中的GROUP BY ACTIVE,name窗口。

通常这不是UDAF的工作,因为UDAFs不提供任何定义顺序的方法。看起来这里真正需要的是一些窗口函数和标准聚合的组合

从pyspark.sql.functions导入col、lag、avg 从pyspark.sql.window导入窗口 df=。。。 DataFrame[activity:string,name:string,window:bigint, 时间戳:bigint,值:float] 组=[活动、名称、窗口] w=窗口 .partitionBy*组 .orderBytimestamp v_diff=colvalue-lagvalue,1.0v t_diff=coltimestamp-lagtimstamp,1.0v 斜率=v_diff/t_diff df.withColumnslope,slope.groupBy*group.AGGAVGCOLLSLOPE
这绝对不是UDAF的工作。@zero323您如何处理此问题?计算连续点的斜率,然后进行简单平均。但这里的输入描述相当模糊。您能否发布具有预期输出的示例数据?尤其是您是否期望窗口之间的坡度?如果没有,确定行顺序的时间戳在哪里?@zero323我已经编辑了示例输入以使其更清晰。计算连续点的斜率并获得平均值正是我想要做的,但不知道在Spark中正确的方法是什么。这似乎是一个好方法!但是,withColumn似乎忽略了slope,而只是返回值的平均值:/如果slope被注册为常规函数,它可以被使用吗?输入错误。它应该是agg条款中的斜率。