我在 Google Big Query 上抛出了一些日志文件,并且已经制定了大约 7 个月的流程。我们已经重建了站点,所以我制作了一个新表和几乎相同的过程。我可以从 Google 存储中批量上传旧文件,并且大多数文件都会毫无意外地加载。然后当我在 cronjob 中运行相同的程序时,BQ 报告后端错误并且数据未加载。
该文件经过 gzip 压缩并以制表符分隔。我正在使用 Python gzip 包。我相信我已经通过阅读原始文件对这些文件进行了适当的预处理,删除了所有没有正确数量的字段(在本例中为 476)的行,然后写入并上传到谷歌存储。错误几乎总是发生在文件末尾。同样奇怪的是,我对坏行设置了很高的容忍度,并将 BQ 设置为将所有字段作为字符串读取。它仍然没有加载。
Error loading table: {u'endTime': u'1373914994246',
u'load': {u'inputFileBytes': u'528384',
u'inputFiles': u'1',
u'outputBytes': u'0',
u'outputRows': u'4610'},
u'startTime': u'1373914986420'}
{u'errorResult': {u'location': u'Line:4612 / Field:1',
u'message': u'Error reading source file',
u'reason': u'backendError'},
u'errors': [{u'location': u'Line:4611 / Field:125',
u'message': u'Bad character (ASCII 0) encountered: field starts with: <1373339>',
u'reason': u'invalid'},
{u'location': u'Line:4612 / Field:1',
u'message': u'Error reading source file',
u'reason': u'backendError'}],
u'state': u'DONE'}
我正在从 FTP 下载文件,写入一个临时文件。然后我用local_file = gzip.open(fname, 'r')
. 然后我读取它看每一行是不是476个字段,如果不是,我写在别处,如果是,我在本地写。local_file.write(row)
. 然后像这样到谷歌存储:
args = ['python','/path/to/gsutil/gsutil', 'cp', local_file, folder]
call(args)