当前位置: 首页 > 知识库问答 >
问题:

通过Python API加载JSONL数据时检索BigQuery验证错误

尹兴生
2023-03-14

将JSONL文件加载到BigQuery时,如何检索与验证错误相关的更多信息?(问题不是解决问题)

示例代码:

from google.cloud.bigquery import (
    LoadJobConfig,
    QueryJobConfig,
    Client,
    SourceFormat,
    WriteDisposition
)

# variables depending on the environment
filename = '...'
gcp_project_id = '...'
dataset_name = '...'
table_name = '...'
schema = [ ... ]

# loading data
client = Client(project=project_id)
dataset_ref = client.dataset(dataset_name)
table_ref = dataset_ref.table(table_name)
job_config = LoadJobConfig()
job_config.source_format = SourceFormat.NEWLINE_DELIMITED_JSON
job_config.write_disposition = WriteDisposition.WRITE_APPEND
job_config.schema = schema
LOGGER.info('loading from %s', filename)
with open(filename, "rb") as source_file:
    job = client.load_table_from_file(
        source_file, destination=table_ref, job_config=job_config
    )

    # Waits for table cloud_data_store to complete
    job.result()

在这里,我使用bigquery-模式生成器来生成模式(因为BigQuery只查看前100行)。

运行时可能会出错,并显示以下错误消息(google.api\u core.exceptions.BadRequest):

400读取数据时出错,错误消息:JSON表遇到太多错误,放弃。行:1;错误:1。有关详细信息,请查看错误[]集合。

查看错误属性基本上不会提供任何新信息:

[{'reason': 'invalid',
  'message': 'Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the errors[] collection for more details.'}]

我还查看了异常的\uu dict\uuuu,但没有透露任何进一步的信息。

尝试使用bq命令行加载表(在本例中没有明确的模式)会产生一条更有用的消息:

加载操作中的BigQuery错误:处理作业“…”时出错:提供的架构与表不匹配

我现在的问题是如何从Python API中检索到这样有用的消息?

这是一个可以添加的副本和过去的解决方法,以便默认显示更多信息。(可能有缺点)

import google.cloud.exceptions
import google.cloud.bigquery.job


def get_improved_bad_request_exception(
    job: google.cloud.bigquery.job.LoadJob
) -> google.cloud.exceptions.BadRequest:
    errors = job.errors
    result = google.cloud.exceptions.BadRequest(
        '; '.join([error['message'] for error in errors]),
        errors=errors
    )
    result._job = job
    return result


def wait_for_load_job(
    job: google.cloud.bigquery.job.LoadJob
):
    try:
        job.result()
    except google.cloud.exceptions.BadRequest as exc:
        raise get_improved_bad_request_exception(job) from exc

然后调用wait\u for\u load\u job(作业),而不是调用作业。result()将直接导致更有用的异常(错误消息和错误属性)。

共有1个答案

易超
2023-03-14

为了能够显示更有用的错误消息,您可以导入google。api\U核心。例外情况。BadRequest捕获异常,然后使用LoadJob属性错误从作业中获取详细的错误消息。

from google.api_core.exceptions import BadRequest
...
...
try:
    load_job.result()# Waits for the job to complete.
except BadRequest:
    for error in load_job.errors:
        print(error["message"])  # error is of type dictionary

为了测试,我使用了示例代码BQ load json data并更改了输入文件以产生错误。在文件中,我将"post_abbr"的值从字符串更改为数组值。

使用的文件:

{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr":  "AK"}
{"name": "Arizona", "post_abbr": [65,2]}

应用上面的代码段时,请参见下面的输出。最后一条错误消息显示关于接收非重复字段的数组的实际错误。

Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 3; errors: 1. Please look into the errors[] collection for more details.
Error while reading data, error message: JSON processing encountered too many errors, giving up. Rows: 3; errors: 1; max bad: 0; error percent: 0
Error while reading data, error message: JSON parsing error in row starting at position 78: Array specified for non-repeated field: post_abbr.
 类似资料:
  • 我创建了一个avro配置单元表,并使用配置单元插入覆盖命令将数据从另一个表加载到avro表中。我可以在avro配置单元表中看到数据,但当我尝试将其加载到bigQuery表中时,会出现错误。表架构:- 我收到的错误:- 我使用以下命令将数据加载到bigquery中:-

  • 我正在尝试加载一个CVS,其中包含一个数据类型为“timestamp”的字段当我尝试将该数据加载到表中时,会出现以下错误: 谷歌。应用程序编程接口。果心例外情况。BadRequest:400 CSV表遇到太多错误,放弃。行:1;错误:1。 我知道这一列是问题所在,因为当我删除这一列时,数据上传不会出错。我应该如何上传时间戳。 我正在使用bigquery API,python客户端库。 我的数据如下

  • 问题内容: 我正在尝试检索具有ajax加载向下滚动功能alla Twitter的页面中的元素。由于某种原因,此功能无法正常运行。我添加了一些打印语句以对其进行调试,但我总是得到相同数量的项目,然后函数返回。我在这里做错了什么? 问题答案: 尝试介于两者之间 注意:硬睡眠只是为了证明它有效。请改用waits包来等待智能状态。

  • 问题内容: 我正在尝试检索具有ajax加载向下滚动功能alla Twitter的页面中的元素。由于某些原因,此功能无法正常运行。我添加了一些打印语句以对其进行调试,并且我总是得到相同数量的项目,然后函数返回。我在这里做错了什么? 问题答案: 尝试介于两者之间 注意:硬睡眠只是为了证明它有效。请改用waits包来等待智能状态。

  • 我已经用React和Apollo客户端在NestJS服务器上用GraphQL API制作了简单的CRUD应用程序。 我有一个简单的突变: “EmailScalar”类型主要检查“email”输入是否具有格式 它不能通过验证(因为电子邮件类型工作正常) 但当从客户端发送的查询通过验证时: NestJS服务器日志(来自下面的代码) 以前从未使用过NestJS、Apollo、React或GraphQL,

  • 问题内容: 我目前正在阅读Adam Freeman的“ Pro AngularJS”。在阅读这些示例时,他让读者使用Angular(当然)与Deployed服务器资源一起创建了运动商店应用。部署资源已设置为返回要填充到模型中的JSON数据。我正在使用NodeJS运行服务器。当前在端口5000()上设置。部署的资源正在端口5500()上运行。当点击已部署时,响应如下: 我正在尝试通过使用来检索此数据