【发布时间】:2020-04-13 06:05:38
【问题描述】:
我正在考虑使用 BigQuery 的 JavaScript UDF 作为新数据架构中的关键组件。它将用于在逻辑上处理加载到主表中的每一行,并在定期和临时聚合查询期间处理每一行。
为了同样的目的使用 SQL UDF 似乎是不可行的,因为每一行都代表一个复杂的对象,并且在 SQL 中实现业务逻辑,包括解析复杂的文本字段之类的事情,很快就会变得丑陋。
我刚刚在Optimizing query computation 文档页面中阅读了以下内容:
最佳实践:避免使用 JavaScript 用户定义函数。请改用本机 UDF。
调用 JavaScript UDF 需要实例化子进程。 启动此过程并运行 UDF 会直接影响查询 表现。如果可能,请改用本机 (SQL) UDF。
我理解为什么每个处理节点都需要一个新进程,并且我知道 JS 倾向于以每进程单线程的方式部署(尽管如今 v8 确实支持多线程)。但是我不清楚一旦 JS 运行时进程启动,它是否可以在对同一函数的调用之间被重用(例如,用于处理同一处理节点上的不同行)。重复使用的数量可能会显着影响成本。我的表并没有那么大(几千万到几亿行),但是这里还是需要有一个更好的理解。
我找不到任何权威来源。有没有人分析过使用 JavaScript UDF 对每个处理的行的实际影响,在执行时间和成本方面?
【问题讨论】:
标签: performance google-bigquery user-defined-functions