Big Query 作业因“遇到错误字符 (ASCII 0)”而失败。

Posted

技术标签:

【中文标题】Big Query 作业因“遇到错误字符 (ASCII 0)”而失败。【英文标题】:Big Query job fails with "Bad character (ASCII 0) encountered." 【发布时间】:2012-06-13 19:02:26 【问题描述】:

我的工作因错误而失败

行:14222274 / 字段:1,遇到错误字符 (ASCII 0)。其余文件未处理。

数据已压缩,我已验证文件中不存在 ASCII 0 字符。文件中只有 14222273 行,因此错误消息中打印的行号是文件末尾之后的一行。我有来自同一数据集的其他块已成功上传,所以我怀疑这要么是 BQ 错误,要么错误消息并不表示潜在问题。任何解决此问题的帮助将不胜感激。谢谢。

>>> data = open("data.csv").read()
>>> chr(0) in data
False
>>> data[-1]
'\n'

【问题讨论】:

嗨,John:您能否确认未压缩的文件不以结尾的 '\0' 字符结尾? @MichaelManoochehri 文件中的最后一个字节是换行符。 >>> chr(0) in open("data.csv").read() False 在没有实际数据的情况下几乎不可能进行调试。您能否将原始问题文件解压缩,将其拆分为 2 个文件,重新 gzip 并重新摄取到 BigQuery 中?或者,您是否可以仅使用原始文件的最后 2 行创建一个新文件,尝试重新提取,如果您遇到相同的错误,请告诉我们? @MichaelManoochehri 我测试了这两种情况。我创建了 3 个文件,一个只包含最后 2 行,一个包含前半部分,一个包含后半部分。我压缩并上传了所有 3 个,它们都成功完成了。 【参考方案1】:

我遇到了类似的问题,尝试在 BigQuery 中加载一个压缩文件(将其保存在 Google Cloud Storage 中)。这些是日志:

文件:0 / 偏移量:4563403089 / 行:328480 / 字段:21:遇到错误字符(ASCII 0):字段开头为:(错误代码:无效) 文件:0 / 偏移量:4563403089 / 行:328485 / 字段:21:遇到错误字符(ASCII 0):字段开头为:(错误代码:无效) 文件:0 / 偏移量:4563403089 / 行:328490 / 字段:21:遇到错误字符(ASCII 0):字段开头为:(错误代码:无效) 文件:0 / 偏移量:4563403089 / 行:328511 / 字段:21:遇到错误字符(ASCII 0):字段开头为:(错误代码:无效) 文件:0 / 偏移量:4563403089 / 行:328517 / 字段:21:遇到错误字符(ASCII 0):字段开头为:(错误代码:无效)

为了解决这个问题,我所做的是从压缩文件中删除 ASCII 0 字符。为此,我从安装了 sdk 的 Compute Engine 实例中执行了以下命令:

gsutil cp gs://bucket_987234/compress_file.gz - |枪弹 | tr -d '\000' | gsutil cp - gs://bucket_987234/uncompress_and_clean_file

通过使用管道,我避免了将所有存储都放在硬盘上(1G 压缩 + 52G 解压缩)。第一个程序从 Storage 获取压缩文件,第二个程序解压缩,第三个程序删除 ASCII 0 字符,第四个程序将结果上传到 Storage。

当我再次上传到存储时,我不会压缩结果,因为 BigQuery 加载未压缩文件的速度更快。之后,我可以毫无问题地在 BigQuery 上加载数据。

【讨论】:

我的问题是,如果我想使用python来执行gsutil shell,我需要连接一个字符串。很难生成字符串 '\000' 。我在这里发布了一个问题。 ***.com/questions/69231318/…。你能帮我看看吗?【参考方案2】:

你压缩的时候用了什么工具?

当我以 ZIP 格式(在 Windows 中)压缩我的 csv 文件时,我看到了这个问题。 Google BigQuery 似乎只接受 gzip 格式。

确保使用 gzip 压缩您的 CSV。如果您在 Windows 中,7-zip 是一个很棒的实用程序,它允许您在 gzip 中进行压缩。

在 Unix 中 gzip 是标准的。

【讨论】:

我在 Ubuntu 11.10 上使用 gzip 1.3.12。 您是否也检查过字符编码。该文件应该是 UTF-8 格式。它还支持另一种编码。字符编码 默认情况下,BigQuery 服务要求所有源数据都采用 UTF-8 编码。或者,如果您有以 ISO-8859-1 格式编码的数据,则应在导入数据时明确指定编码,以便 BigQuery 可以在导入过程中正确地将您的数据转换为 UTF-8。目前,只能导入 ISO-8859-1 或 UTF-8 编码的数据。指定数据的字符编码时,请记住以下几点:【参考方案3】:

遇到错误字符 (ASCII 0)。其余文件未处理。

明确指出您那里有一个无法解码的 UTF-16 字符。 BigQuery 服务仅支持 UTF-8 和 latin1 文本编码。因此,该文件应该是 UTF-8 编码的。

文件中只有 14222273 行,所以行号是 打印在错误消息中的是文件末尾之后的一行。

可能文件末尾有一个 UTF-16 编码的制表符,无法解码。


解决方案:将-a--ascii 标志与gzip 命令一起使用。会被bigquery解码好。

【讨论】:

以上是关于Big Query 作业因“遇到错误字符 (ASCII 0)”而失败。的主要内容,如果未能解决你的问题,请参考以下文章

写入 Big Query 时数据流作业失败 - 未找到 JSON 文件

Big Query 作业的 Python 脚本配置需要 sourceUri 值,但没有 sourceUri

无法导出 Big Query 表

将存储在 Google Cloud Storage 中的文件加载到 Big Query 时出错

Google Big Query Error: CSV table 遇到太多错误,放弃。行:1 错误:1

Big Query-如何在 Big Query 中按浏览量、用户每周比较数据