首页 > 解决方案 > 在每条记录上应用函数 - SQL UDF 或 Spark

问题描述

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

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

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

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

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

标签: mysqlapache-sparkpysparkvertica

解决方案


瓶颈始终是往返于数据库的数据。

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

您是否真正探索过您可以使用的所有功能,DBMS 实际上符合 ANSI 99 甚至 ANSI 2003 的 SQL 标准?

实际上,您会惊讶地发现,在 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/创作/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


推荐阅读