未定义全局名称“bigquery”

Posted

技术标签:

【中文标题】未定义全局名称“bigquery”【英文标题】:global name 'bigquery' is not defined 【发布时间】:2018-09-26 23:53:31 【问题描述】:

我创建了一个 google 数据流作业,但即使我已经导入了所需的变量,我仍不断收到未定义的全局名称“bigquery”。

这是我的进口清单:

from __future__ import absolute_import

import argparse
import logging
import ast
import json

import apache_beam as beam
from apache_beam.io import ReadFromText, WriteToText 
from apache_beam.options.pipeline_options import PipelineOptions
from apache_beam.options.pipeline_options import SetupOptions
from apache_beam.options.pipeline_options import StandardOptions
from google.cloud import bigquery

这是返回错误的类:

class CheckExistance(beam.DoFn):

    def __init__(self, table):
        self.table = table.replace(":", ".")

    def process(self, element):

        client = bigquery.Client()
        date = element['date'].split(" ")[0]

        query_job = client.query("""
        QUERY """ % (self.table, date))

        yield element

你们知道是什么导致了这个错误吗? 顺便说一句,我只在将它部署到谷歌的数据流作业时遇到这个错误,它在本地运行良好。

编辑:

我可以通过将导入的位置更改为需要 bigquery 变量的函数内部来解决最初的问题,如下所示:

class CheckExistance(beam.DoFn):

    def __init__(self, table):
        self.table = table.replace(":", ".")

    def process(self, element):
        from google.cloud import bigquery
        client = bigquery.Client()
        date = element['date'].split(" ")[0]

        query_job = client.query("""
        QUERY""" % (self.table, date))

        yield element

但现在我收到一条错误消息,说“客户端”没有属性查询,即使我在数据流作业上的包是最新的并且它在本地运行没有任何问题。

错误信息:

AttributeError: 'Client' 对象没有属性 'query'

【问题讨论】:

【参考方案1】:

我猜您需要启用 BigQuery

资源 / 高级 Google 服务 / 启用 BigQuery

编辑:检查 cmets 以查看故障排除、发现和有效的方法。

【讨论】:

它已经启用,我能够修复最初的错误,但现在我得到了一个不同的错误 @PedroDaumas 比较本地和部署位置的 bigquery 版本。 两者都使用相同版本的包 @PedroDaumas 数据流是否支持 Python/BigQuery? @PedroDaumas client.run_async_query 或 run_sync_query 工作吗?

以上是关于未定义全局名称“bigquery”的主要内容,如果未能解决你的问题,请参考以下文章

NameError:未定义全局名称“reduce”

在引发 ValidationError 期间“未定义全局名称'_'”

未定义全局名称“lats”

名称错误:未定义全局名称“BaseFunction”

熊猫不进口吗? 'NameError:未定义全局名称'pandas''

未定义全局名称“reverse”