2017-10-17 72 views
0

我会尽我所能描述我的情况,然后我希望本网站上的其他用户可以告诉我我正在服用的课程是否合理,或者是否需要重新评估我的方法/选项。写一个UDAF来执行火花数据帧的滚动回归是否有意义?

背景:

我用pyspark,因为我最熟悉Python VS斯卡拉,java或R.我有一个从蜂巢表使用pyspark.sql查询表构成的火花数据帧。在这个数据框中,我有许多不同的'文件'。每个文件都由时间序列数据组成。我需要对每个“文件”的整个时间值对数据的子集执行滚动回归。在做了一些研究之后,我计划创建一个窗口对象,制作一个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的经验,但我肯定有足够的动力去学习写这个函数。

我想知道是否有人对此任务有任何见解或建议。我觉得在完成研究之后,这是可能的,也是适当的行动方向。然而,当我尝试做这项工作的时候,我感到很害怕,因为这是根本不可能的,或者比我想象的更困难。

感谢您的洞察力。

+0

很难说没有关于计算的更多细节,以及您打算如何使用org.apache.spark.ml.regression。你能否提供更多细节? –

+0

当然,这里是我写的python代码,tbh我不知道它是否工作,因为我无法测试它: 'def lrreg_int(sin_time,cos_time,prediction): lr = ml.regression.LinearRegression (predictionCol = prediction) model = lr.fit(sin_time,cos_time) intercept = model.intercept return intercept' –

+0

仍然不清楚你试图达到什么。你说,基于时间序列的滚动线性回归,这听起来像是一个面向流的回归方法,你有没有看看面向流的mllib?根据你所说的,这可能是你想要的http://spark.apache.org/docs/2.2.0/mllib-linear-methods.html#streaming-linear-regression –

回答

0

做的研究,我正计划建立一个窗口对象定好位,使得该规定我怎么想发生(使用函数内部的火花毫升线性回归我的线性回归UDF后

不管PySpark是否支持UDAF,你都不能使用分布式算法

问题有点含糊不清,不清楚你有多少数据, d考虑使用普通的RDD与scikit-learn(或类似的工具)或尝试实现一个整体从头开始。

+0

“您不允许使用分布式算法从UDF/UDAF” 所以你的意思在这里是什么,我不能使用内置的回归库?这就是你指的分布式算法? 我认为在RDD中这样做,但我可能不得不与我的数据来回多次,但如果这是一个选项,我会考虑它。 如果你所说的是我不能使用内置的回归,我可以创建自己的迷你函数来处理它(至少在python中),所以很高兴知道这是一个选项。 也感谢给我一些具体的清晰度 –

+0

是的,这就是我的意思。 – user8792510

+0

好吧,我自己写回归代码,否则我的建议很有道理,有可能吗?很酷,我会标记我的答案然后解决。谢谢!! –