【问题标题】:Applying Function On Every Record - SQL UDF or Spark [closed]在每条记录上应用函数 - SQL UDF 或 Spark [关闭]
【发布时间】:2020-08-01 07:17:21
【问题描述】:

我正在使用 Vertica,并且我有一些用 Python 编写的函数,这些函数使用 numpy 线性代数功能/scipy 优化并且太复杂而无法用 SQL 编写。

基于基准,哪些选项会表现更好 -

1- Vertica UDF - 原始 python 函数的 udf 将应用于每条记录。

2- 使用 Pyspark 并将函数直接应用于每条记录。

在每条记录上应用 python 函数哪个更快 - Spark 或 Vertica UDF?

【问题讨论】:

    标签: mysql apache-spark pyspark vertica


    【解决方案1】:

    瓶颈是总是数据往返于数据库。

    因此,将功能带到数据所在的位置,而不是将数据带到功能中 - 始终如此。

    您是否真正探索过使用真正符合 ANSI 99 甚至 ANSI 2003 SQL 标准的 DBMS 拥有的所有功能?

    实际上,您会惊讶地发现,在 SQL 中太复杂而无法完成的事情竟然如此之少。

    我早就到了要说的地步:

    如果您不能在 SQL 中执行此操作,请在 C(或 C++)中执行。如果你不能在 C 中做到这一点,那就不值得去做。在网上搜索“Real Programmers Don't Use Pascal”以了解我的意思。

    首先,检查 DBMS 的文档。尤其是Vertica的,真的很详细。

    然后,创建 SQL 函数。并且 - 仅作为最后的手段,编写用户定义的扩展。

    您可以构建的最佳架构很简单。

    最好的代码是你不必开发的。

    回应您在此期间发布的评论:

    1. 探索 Vertica 中的机器学习函数库和文档 - 您无需开发大量功能,只需使用即可: https://www.vertica.com/docs/10.0.x/HTML/Content/Authoring/SQLReferenceManual/Functions/MachineLearning/_MLFunctions.htm?tocpath=SQL%20Reference%20Manual%7CSQL%20Functions%7CMachine%20Learning%20Functions%7C_____0

    对于任何可能缺少的东西 - 尝试用户定义的扩展 - 在 Python 中,在你的情况下:

    https://www.vertica.com/docs/10.0.x/HTML/Content/Authoring/ExtendingVertica/UDx/DevelopingUDxs.htm?tocpath=Extending%20Vertica%7CDeveloping%20User-Defined%20Extensions%20(UDxs)%7C_____0

    和:

    https://www.vertica.com/docs/10.0.x/HTML/Content/Authoring/ExtendingVertica/Python/IntroductionPythonSDK.htm?tocpath=Extending%20Vertica%7CDeveloping%20User-Defined%20Extensions%20(UDxs)%7CDeveloping%20with%20the%20Python%20SDK%7C_____0

    【讨论】:

    • 我需要在非常简单的函数上使用优化算法(L-BFGS-B),计算许多叉积和矩阵相乘——这正是 numpy/scipy 的目标。我没有找到任何对线性代数/优化的 SQL 支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2011-04-03
    相关资源
    最近更新 更多