加载操作中的GCP Bigquery错误:缺少字节

问题描述

我对Google Cloud Platform还是很陌生,我正试图通过存储在GCP存储桶中的约60,000 csv.gz文件在bigquery中创建一个表。

为此,我打开了Cloud Shell,然后尝试以下操作:

$ bq --location=US mk my_data
$ bq --location=US \
     load --null_marker='' \
     --source_format=CSV --autodetect \
     my_data.my_table gs://my_bucket/*.csv.gz

这将引发以下错误

BigQuery error in load operation: Error processing job 'my_job:bqjob_r3eede45779dc9a51_0000017529110a63_1': 
Error while reading data,error message:
Failed_PRECONDITION: Invalid gzip file: bytes are missing

我不知道在加载文件时如何查找哪个文件可能有问题。我已经检查了一些文件,它们都是有效的.gz文件,我可以在解压缩后使用任何csv阅读器打开它们,但是我不知道如何检查所有文件以查找有问题的文件

在此先感谢您的帮助!

解决方法

要遍历存储桶,可以使用eval命令

#!/bin/bash
FILES="gsutil ls gs://YOUR_BUCKET"
RESULTS=$(eval $FILES)
for f in $RESULTS
do
  read="gsutil cat $f | zcat | wc -c"
  if [[ $(eval $read) == "0" ]]
    then
        #<Process it,Print name or Delete from bucket like below>
        delete="gsutil rm $f"
        eval $delete
    fi
done

如果可能的话,另一个选择是download all your files locally,然后从那里进行处理:

gsutil -m cp -R gs://YOUR_BUCKET .
,

其中的.gz文件可能不包含任何数据。您可能需要编写一个脚本来过滤.gz文件是否有效。

此示例bash脚本将通过.gz文件进行目录循环,如果它们为空,则将其删除。

for f in dir/*
do
    if [[ $(gunzip -c $f | head -c1 | wc -c) == "0" ]] 
    then
        do_file_creation
    fi
done

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...