Snowpipe 无法读取由 BigQuery 导出的 DEFLATE 压缩的 AVRO
Posted
技术标签:
【中文标题】Snowpipe 无法读取由 BigQuery 导出的 DEFLATE 压缩的 AVRO【英文标题】:Snowpipe fails to read AVRO compressed by DEFLATE exported from BigQuery 【发布时间】:2021-08-12 18:40:40 【问题描述】:我正在尝试将从 BigQuery 导出的数据导入为 AVRO 并压缩为 DEFLATE。除了 NONE 之外,两者唯一共同的编码是 DEFLATE。 我正在导出具有 13,343,598 行的公开可用数据集 bigquery-public-data:covid19_open_data.covid19_open_data 之一。我正在使用以下命令导出:
bq extract --destination_format=AVRO --compression=DEFLATE bigquery-public-data:covid19_open_data.covid19_open_data gs://staging/covid19_open_data/avro_deflate/covid19_open_data_2_*.avro
该命令在 GCP 中创建 17 个文件。当我使用命令查询文件中的数据时:
SELECT count(*) FROM @shared.data_warehouse_ext_stage/covid19_open_data/avro_deflate;
我只得到 684,5021 行的计数。为了解决管道中的错误,我发出命令:
SELECT * from table(information_schema.copy_history(table_name=>'covid19_open_data', start_time=> dateadd(hours, -1, current_timestamp())));
管道报错如下:
文件解压时遇到无效数据:“covid19_open_data_3_000000000006.avro”,使用的压缩类型:“DEFLATE”,原因:“数据错误”
文件格式命令的 SQL 是:
CREATE OR REPLACE FILE FORMAT monitoring_blocking.dv_avro_deflate_format TYPE = AVRO COMPRESSION = DEFLATE;
我知道这个问题只与压缩压缩有关。 AVRO 只有两种压缩方式对于 BigQuery 和 Snowflake NONE 和 DEFLATE 都是通用的。我还创建了两个管道,一个文件格式为 AVRO,压缩为 NONE,第二个文件格式为 CSV 和 GZIP。它们都将数据加载到表中。除了文件格式之外,这两个 AVRO 管道是彼此的镜像。这是管道的 SQL 的 sn-p:
创建或替换管道 covid19_open_data_avro AUTO_INGEST = 真 INTEGRATION = 'GCS_PUBSUB_DATA_WAREHOUSE_NOTIFICATION_INT' AS 复制到 covid19_open_data( location_key ,日期 ,place_id ,wikidata_id ... ) 从 (选择 $1:location_key ,$1:date 作为日期 ,$1:place_id AS place_id ,$1:wikidata_id 作为 wikidata_id ... 来自@shared.staging/covid19_open_data/avro_deflate) FILE_FORMAT = monitoring_blocking.dv_avro_deflate_format;
【问题讨论】:
如果无压缩版本可以工作,这听起来像是一个错误。我很想获取未压缩的 AVRO 文件并在本地压缩它们,然后尝试加载它们。如果可行,则意味着它是写入层,并且如果本地压缩无法加载,则说明是雪花处理。这可以通过翻转测试进行双重检查,并在本地解压缩压缩的输出文件,并检查雪花是否可以读取那些,这再次消除了写入阶段。最后一点,与文件流压缩相比,这仅在对整个文件进行压缩时才有效。 如果是 Snowflake 错误,我会开一张支持票。包括您的详细复制品。 顺便说一句,这个 covid 数据是问题的样本,还是导出的目标? Snowflake 已经在 Marketplace 上提供了一个很棒的 COVID-19 数据提供程序,如果您需要的话:snowflake.com/datasets/starschema-covid-19-epidemiological-data -- 无论如何,这是在 Snowflake 方面解决的一个很好的 Avro 问题。 【参考方案1】:问题在于雪花。当我们将 FILE FORMAT 定义中的压缩格式更改为 AUTO 时,它起作用了
CREATE OR REPLACE FILE FORMAT my_schema.avro_compressed_format
TYPE = AVRO
COMPRESSION = DEFLATE;
到
CREATE OR REPLACE FILE FORMAT my_schema.avro_compressed_format
TYPE = AVRO
COMPRESSION = AUTO;
【讨论】:
以上是关于Snowpipe 无法读取由 BigQuery 导出的 DEFLATE 压缩的 AVRO的主要内容,如果未能解决你的问题,请参考以下文章
Snowpipe 云消息传递机制如何在 Azure 上准确运行?