我正在尝试创建AWS Glue ETL作业,该作业将把存储在S3中的镶木地板文件中的数据加载到Redshift表中。Parquet文件是使用panda和"简单"文件模式选项写入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 Catalog中创建一个表,该表可以从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中构建它们的建议?
Redshift不支持镶木地板格式。红移光谱的确如此。Athena还支持镶木地板格式。
您面临的错误是,当从spark/glue读取s3中的镶木地板文件时,它希望数据位于配置单元分区中,即分区名称应该具有键值对
s3://你的桶/parquet_table/id=1/file1.parquet
s3://你的桶/parquet_table/id=2/file2.parquet
等等。
然后使用以下路径读取bucket 中的所有文件
位置:s3://您的bucket/parquet_table
如果s3中的数据以上述方式进行分区,您将不会面临任何问题。