【问题标题】:Bigquery error (ASCII 0) encountered for external table and when loading table外部表和加载表时遇到 Bigquery 错误 (ASCII 0)
【发布时间】:2021-07-06 20:24:40
【问题描述】:

我收到此错误
“错误:解析从位置开始的行时检测到错误:4824。错误:遇到错误字符(ASCII 0)。”

数据未压缩。 我的外部表指向多个 CSV 文件,其中一个包含几行带有该字符的行。在我的表定义中,我添加了“MaxBadRecords”,但这没有效果。在常规表中加载数据时,我也遇到了同样的问题。

我知道我可以使用 DataFlow 甚至尝试修复 CSV,但是否有替代方法不包括编写解析器,并且希望同样简单高效?

【问题讨论】:

标签: google-bigquery


【解决方案1】:

是否有不包括编写解析器的替代方法,并且希望同样简单高效?

在 Google Cloud SDK Shell 中尝试以下(使用 tr 实用程序)

gsutil cp gs://bucket/badfile.csv - | tr -d '\000' | gsutil cp - gs://bucket/fixedfile.csv   

这会

  1. 阅读您的“坏”文件
  2. 删除 ASCII 0
  3. 将“固定”文件保存到新文件中

在你有了新文件后——只要确保你的表格现在指向那个固定的文件

【讨论】:

  • 嗨,米哈伊尔。我有几个问题:如果旧文件和新文件的文件名相同怎么办?考虑到 GCS 存储桶每小时与某个 FTP 服务器同步,它会有多慢,所以同步过程会覆盖文件,我必须在之后运行它?我曾尝试使用 sed 命令,但由于每次同步时它都必须在所有文件上运行,所以速度非常慢,而且由于文件名相同,我收到一条错误消息,提示资源正忙,
  • 你可以简单地尝试用提取的 ascii 0 覆盖旧文件,看看它如何为你工作 :o) - 试试吧。每小时处理一次 - 老实说,我没有考虑过这种情况,因为我认为这只是一种错误文件的情况 - 但您仍然可以尝试将该修复过程作为与 ftp 同步的一部分(最后一步) .很难判断它有多快/多慢,因为它取决于多种因素 - 唯一的方法是尝试和试验你的文件,看看它是否可以工作
  • 但实际上,在考虑将此技巧作为每小时与 ftp 同步的一部分之前 - 我认为您应该首先检查这是否真的有效并解决问题!你能试着确认一下吗?因为这主要是您问题的范围:o)
  • 对于较大的文件来说这对我来说有点太慢了,所以我决定做一些避免的事情,我编写了一个数据流管道来从模式中导入
  • @Jordan - 有道理!
【解决方案2】:

有时文件中会出现最后一个字节。

感谢:

tr '\0' ' ' < file1 > file2

【讨论】:

    【解决方案3】:

    您可以使用 python 或 PowerShell 等外部工具清理文件。无法在 bigquery 中加载任何带有 ASCII0 的文件

    这是一个可以用python清除文件的脚本:

    def replace_chars(self,file_path,orignal_string,new_string):
        #Create temp file
        fh, abs_path = mkstemp()
        with os.fdopen(fh,'w', encoding='utf-8') as new_file:
            with open(file_path, encoding='utf-8', errors='replace') as old_file:
                print("\nCurrent line: \t")
                i=0
                for line in old_file:
                    print(i,end="\r", flush=True)
                    i=i+1
                    line=line.replace(orignal_string, new_string)
                    new_file.write(line)
        #Copy the file permissions from the old file to the new file
        shutil.copymode(file_path, abs_path)
        #Remove original file
        os.remove(file_path)
        #Move new file
        shutil.move(abs_path, file_path)
    

    相同,但适用于 PowerShell:

    (Get-Content "C:\Source.DAT") -replace "`0", " " | Set-Content "C:\Destination.DAT"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2021-12-26
      • 1970-01-01
      相关资源
      最近更新 更多