mysql - 在每条记录上应用函数 - SQL UDF 或 Spark
问题描述
我正在使用 Vertica,并且我有一些用 Python 编写的函数,这些函数使用 numpy 线性代数功能/scipy 优化,并且太复杂而无法用 SQL 编写。
根据基准,哪些选项会表现更好 -
1- Vertica UDF - 原始 python 函数的 udf 将应用于每条记录。
2- 使用 Pyspark 并将函数直接应用于每条记录。
在每条记录上应用 python 函数哪个更快 - Spark 或 Vertica UDF?
解决方案
瓶颈始终是往返于数据库的数据。
因此,始终将功能带到数据所在的位置,而不是将数据带到功能上。
您是否真正探索过您可以使用的所有功能,DBMS 实际上符合 ANSI 99 甚至 ANSI 2003 的 SQL 标准?
实际上,您会惊讶地发现,在 SQL 中太复杂而无法完成的事情竟然如此之少。
我早就到了要说的地步:
如果你不能用 SQL 做,那就用 C(或 C++)做。如果你不能在 C 中做到这一点,那就不值得去做。在网上搜索“Real Programmers Don't Use Pascal”以了解我的意思。
首先,检查 DBMS 的文档。尤其是Vertica,非常详细。
然后,创建 SQL 函数。并且 - 仅作为最后的手段,对用户定义的扩展进行编码。
您可以构建的最佳架构很简单。
最好的代码是您不必开发的代码。
回应您在此期间发布的评论:
- 探索 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 中,在你的情况下:
和:
推荐阅读
- flutter - Flutter:初始值未在表单中更新(FormBuilder)
- algorithm - 按字典顺序排序的堆栈排列
- swift - Swift 最终会有原生选择器吗?
- webrtc - WebRTC 移动摄像头不切换
- python - 在 Python 中,这个带有嵌套列表的列表是如何排序的?
- kinect - Xbox 360 Kinect 与 MS Teams 一起用作网络摄像头摄像头驱动程序运行时,仅将设备识别为音频
- java - 使用多个源值时,有没有办法为 Mapstruct 指定默认输入参数?
- reactjs - 尝试将 Blob 对象设置为 React State 挂钩
- javascript - Web 组件加载未知组件
- amazon-web-services - 使用 codepipeline 的 AWS API-Gateway 蓝/绿部署