0

我对 Google Cloud Platform 非常陌生,我正在尝试从csv.gz存储在 GCP 存储桶中的约 60,000 个文件中创建一个 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 阅读器打开,但我不知道如何检查所有文件以找到有问题的文件。

提前感谢您对此的任何帮助!

4

2 回答 2

1

要遍历您的存储桶,您可以使用 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

如果可能,另一种选择是在本地下载所有文件,然后从那里处理:

gsutil -m cp -R gs://YOUR_BUCKET .
于 2020-11-05T10:06:11.640 回答
0

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

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

for f in dir/*
do
    if [[ $(gunzip -c $f | head -c1 | wc -c) == "0" ]] 
    then
        do_file_creation
    fi
done
于 2020-10-15T09:45:11.697 回答