从 Google Cloud Datalab 向 BigQuery 插入数据时如何调试解析错误?

Posted

技术标签:

【中文标题】从 Google Cloud Datalab 向 BigQuery 插入数据时如何调试解析错误?【英文标题】:How to debug parse error when inserting data to BigQuery from Google Cloud Datalab? 【发布时间】:2015-12-17 17:59:24 【问题描述】:

如何调试无法从 Google Cloud Datalab 将数据插入 BigQuery 的问题?

这是我的代码,但它在最后一行抛出错误。 aggregate_data 是一个有 8172 行和 92 列的 Pandas 数据框:

ds = 'calculations'
dataset = bq.DataSet(ds)
dataset.create()
schema = bq.Schema.from_dataframe(aggregate_data)
table_name = 'cost_ratios'
temptable = bq.Table(ds + '.' + table_name).create(schema=schema, 
                                                   overwrite=True)
temptable.insert_data(aggregate_data)

这是抛出的错误:

RequestException                          Traceback (most recent call last)
<ipython-input-6-b905b654683e> in <module>()
     49 temptable = bq.Table(ds + '.' + table_name).create(schema=schema, 
     50                                                    overwrite=True)
---> 51 temptable.insert_data(aggregate_data)

/usr/local/lib/python2.7/dist-packages/gcp/bigquery/_table.pyc in insert_data(self, data, include_index, index_name)
    364           response = self._api.tabledata_insertAll(self._name_parts, rows)
    365         except Exception as e:
--> 366           raise e
    367         if 'insertErrors' in response:
    368           raise Exception('insertAll failed: %s' % response['insertErrors'])

RequestException: Parse Error

在 BQ 中查看,已使用正确的架构创建表,但其中没有数据。

如何进一步调试?上面的错误并没有告诉我太多信息,而且我在 BigQuery 中看不到任何内容。

【问题讨论】:

在您使用的任何框架将其转换为异常之前,您能否从 BigQuery 服务获取原始响应? 【参考方案1】:

我的猜测是 Dataframe 中有不符合 Schema 的数据。该错误来自 BigQuery,我认为是由于它尝试根据规范中指定的类型解析字段但失败。

尝试捕获该异常并打印其“内容”属性;这将为您提供 BigQuery 的完整响应,并可能更清楚地说明问题。

【讨论】:

以上是关于从 Google Cloud Datalab 向 BigQuery 插入数据时如何调试解析错误?的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud datalab 查询 BIgQuery 表时出错

如何在我的本地 linux 服务器上运行 google-cloud-datalab?

通过 Cloud Datalab 加入 Google BigQuery

删除 Google Cloud Datalab SQL 模块参数中的引号?

Google Cloud Datalab 中的 BigQuery - 获取查询文本?

如何在 Google Cloud Datalab 中使用 Bigquery JSON 函数