Spark生成的多段Parquet文件Snowflake加载失败问题排查与解决
Snowflake加载Spark生成的多段Parquet文件报错解决
问题场景
使用Spark生成多段Parquet文件后,通过Snowflake的COPY INTO命令从S3加载数据时触发以下错误:
snowflake.connector.errors.ProgrammingError: 100152 (22000):
Error parsing the parquet file:
Invalid:
Parquet file size is 0 bytes
Row 0 starts at line 0, column
此前使用单段Parquet文件时加载正常,怀疑是多段文件的识别问题。
相关代码与文件信息
- 生成Parquet的Spark代码:
spark_dataframe.select("date", "cityid", "prediction") .write.mode("overwrite") .parquet(predictions_path)
- 生成的文件列表(采用snappy压缩):
_SUCCESS part-00000-75a71af4-e797-417a-a2f1-1c31cf9dc891-c000.snappy.parquet part-00001-75a71af4-e797-417a-a2f1-1c31cf9dc891-c000.snappy.parquet part-00002-75a71af4-e797-417a-a2f1-1c31cf9dc891-c000.snappy.parquet part-00003-75a71af4-e797-417a-a2f1-1c31cf9dc891-c000.snappy.parquet part-00004-75a71af4-e797-417a-a2f1-1c31cf9dc891-c000.snappy.parquet
- 原加载SQL:
COPY INTO database.schema.table FROM ( SELECT $1 FROM @database.schema.stage/path_to_parquet ) file_format = (type = parquet)
错误原因
报错根源是Spark生成的_SUCCESS文件——这是一个0字节的空文件,并非标准Parquet格式,但Snowflake默认会遍历加载路径下的所有文件,尝试解析该文件时就会触发「文件大小为0字节」的错误。
解决方法
在COPY INTO语句中添加pattern = '.*parquet'参数,限定只加载后缀为parquet的文件,自动跳过_SUCCESS这类非Parquet文件。
修改后的SQL代码
COPY INTO database.schema.table FROM ( SELECT $1 FROM @database.schema.stage/path_to_parquet ) file_format = (type = parquet) pattern = '.*parquet'
内容的提问来源于stack exchange,提问作者solbs
相关产品推荐
相关产品推荐

