3

我正在尝试创建 AWS Glue ETL 作业,它将数据从存储在 S3 中的镶木地板文件加载到 Redshift 表中。Parquet 文件是使用带有“简单”文件模式选项的 pandas 写入到 S3 bucked 中的多个文件夹中的。布局如下所示:

s3://bucket/parquet_table/01/file_1.parquet

s3://bucket/parquet_table/01/file_2.parquet

s3://bucket/parquet_table/01/file_3.parquet

s3://bucket/parquet_table/01/file_1.parquet

s3://bucket/parquet_table/02/file_2.parquet

s3://bucket/parquet_table/02/file_3.parquet

我可以使用 AWS Glue Crawler 在 AWS Glue 目录中创建一个表,并且可以从 Athena 查询该表,但是当我尝试创建将同一个表复制到 Redshift 的 ETL 作业时它不起作用。

如果我抓取单个文件或抓取一个文件夹中的多个文件,它会起作用,只要涉及多个文件夹,就会出现上述错误

AnalysisException: u'Unable to infer schema for Parquet. It must be specified manually.;'

如果我使用“hive”而不是“简单”模式,则会出现类似问题。然后我们有多个文件夹以及抛出的空镶木地板文件

java.io.IOException: Could not read footer: java.lang.RuntimeException: xxx is not a Parquet file (too small)

在使用 AWS Glue(ETL 和数据目录)时,是否有一些关于如何读取 Parquet 文件并将它们构建在 S3 中的建议?

4

2 回答 2

0

您面临的错误是因为当从 spark/glue 从 s3 读取镶木地板文件时,它期望数据位于 hive 分区中,即分区名称应该具有键值对,您将拥有 s3 层次结构蜂巢式分区如下所示

s3://your-bucket/parquet_table/id=1/file1.parquet

s3://your-bucket/parquet_table/id=2/file2.parquet

等等..

然后使用以下路径读取存储桶中的所有文件

位置:s3://your-bucket/parquet_table

如果 s3 中的数据按上述方式分区,您将不会遇到任何问题。

于 2019-04-23T16:30:58.473 回答
0

Redshift 不支持 parquet 格式。Redshift Spectrum 可以。Athena 还支持 parquet 格式。

于 2018-02-05T20:53:39.663 回答