编写UDAF以对spark数据帧执行滚动回归是否有意义?

时间:2017-10-17 20:09:43

标签: scala apache-spark pyspark window aggregate

我会尽力描述我的情况,然后我希望本网站上的其他用户可以告诉我,我所采取的课程是否有意义,或者我是否需要重新评估我的方法/选项。

背景:

我使用pyspark,因为我最熟悉python vs scala,java或R.我有一个使用pyspark.sql从hive表构建的spark数据帧来查询表。在这个数据框中,我有许多不同的文件'。每个文件都包含时间序列数据。我需要在每个文件的整个时间值上对数据子集执行滚动回归。在做了一些研究后,我计划创建一个窗口对象,制作一个UDF,指定我希望如何进行线性回归(使用函数内部的spark ml线性回归),然后将数据返回到数据帧。这将发生在.withColumn()操作的上下文中。这是有道理的,我觉得这种方法是正确的。我发现目前pyspark不支持创建UDAF(see the linked jira)的能力。所以这就是我目前正在考虑的事情。

显示herehere可以在scala中创建UDAF,然后在pyspark的上下文中引用所述函数。此外,显示here UDAF(用scala编写)能够获取多个输入列(这是必要的功能,因为我将进行多次线性回归 - 接受3个参数)。我不确定的是我的UDAF能否使用我计划用于回归的org.apache.spark.ml.regression。如果不能这样做,我可以使用矩阵手动执行操作(我相信,如果scala允许的话)。我几乎没有使用scala的经验,但我当然有动力学习写这个功能。

我想知道是否有人对未来的这项任务有任何见解或建议。我觉得在完成研究之后,这既有可能,也有适当的行动方案。然而,当我从根本上不可能或者比我想象的更困难时,我害怕燃烧大量时间试图完成这项工作。

感谢您的见解。

1 个答案:

答案 0 :(得分:0)

  

在做了一些研究后,我正计划创建一个窗口对象,制作一个UDF,指定我希望如何进行线性回归(使用函数内的spark ml线性回归

无论PySpark是否支持UDAF,这都行不通。您不能使用UDF / UDAF中的分布式算法。

问题有点模糊,不清楚您有多少数据,但我考虑使用普通RDD与scikit-learn(或类似工具)或尝试从头开始实现整个事情。