You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery中Python UDF调用报错‘函数构建失败’的原因及解决

BigQuery Python UDF 构建失败问题解决

问题重现

我复刻BigQuery官方文档中带外部Python包的UDF示例,成功执行以下UDF创建语句:

CREATE FUNCTION `<Project ID>.<Dataset ID>`.area(radius FLOAT64)
RETURNS FLOAT64 LANGUAGE python
OPTIONS (entry_point='area_handler', runtime_version='python-3.11', packages=['scipy==1.15.3'])
AS r"""
import scipy

def area_handler(radius):
  return scipy.constants.pi*radius*radius
""";

但执行调用语句 SELECT ..area(4.5); 时,出现报错:The function Project_ID.Dataset_ID.area failed to build.

报错原因

经BigQuery官方团队确认,该问题源于项目启用了VPC Service Controls(VPC-SC)。VPC-SC的网络隔离策略会阻止BigQuery访问外部网络,而Python UDF构建时需要从PyPI下载指定的外部依赖包(如示例中的scipy),这一下载操作被VPC-SC拦截,最终导致UDF构建失败。

解决方法

针对该问题,有两种可行的解决思路:

方法1:配置VPC-SC允许访问PyPI资源

在VPC-SC的访问策略中添加外部资源规则,允许BigQuery访问PyPI的核心下载域名:

  • 需要开放的域名:pypi.org、files.pythonhosted.org
  • 操作步骤:
    • 进入Google Cloud控制台的VPC Service Controls页面
    • 找到项目对应的访问策略(Access Policy)
    • 在策略中添加外部资源列表,将上述域名纳入允许访问范围
    • 确保BigQuery服务账号拥有访问这些外部资源的权限

方法2:使用私有存储托管依赖包

若不想开放外部网络访问,可将所需Python包上传至Cloud Storage,再在UDF中指定私有包路径:

  1. 提前下载对应版本的scipy包(.whl格式)
  2. 将包文件上传至项目的Cloud Storage存储桶(需确保BigQuery拥有该存储桶的读取权限)
  3. 修改UDF创建语句,在OPTIONS中添加package_locations参数指向Cloud Storage路径:
CREATE FUNCTION `<Project ID>.<Dataset ID>`.area(radius FLOAT64)
RETURNS FLOAT64 LANGUAGE python
OPTIONS (
  entry_point='area_handler', 
  runtime_version='python-3.11', 
  packages=['scipy==1.15.3'],
  package_locations=['gs://your-bucket-path/scipy-1.15.3-cp311-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl']
)
AS r"""
import scipy

def area_handler(radius):
  return scipy.constants.pi*radius*radius
""";

内容的提问来源于stack exchange,提问作者Neil Bhutada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:15:10