Analysis Glue ETL作业因AnalysisException失败:u'无法推断Parquet的架构。必须手动指定。'

时间:2017-11-14 11:06:10

标签: amazon-web-services apache-spark parquet aws-glue

我正在尝试创建AWS Glue ETL Job,它会将存储在S3中的镶木地板文件中的数据加载到Redshift表中。 Parquet文件是用大熊猫写的,简单的'文件架构选项到S3中的多个文件夹中。 布局如下所示:

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作业时,它不起作用。

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

import { Component, OnInit } from '@angular/core'; import { DataService } from '../../../shared/services/data.service'; import { Router } from '@angular/router'; @Component({ selector: 'app-dummy', templateUrl: './dummy.component.html', styleUrls: ['./dummy.component.scss'] }) export class DummyComponent implements OnInit { loading= false; users= []; pinId; name: string; constructor(private router: Router, private dataService: DataService) { } ngOnInit() {} submit(name) { this.loading = true; this.dataService.getUsers().subscribe(data => { this.users = data; console.log(this.users); this.users.forEach(element => { console.log(element); if (element.name === this.name) { this.pinId = element.pinId; console.log(this.pinId); setTimeout(function() { console.log(this.pinId); if (this.pinId) { this.loading = false; this.router.navigate(['schedule']); } }, 2000); } }); }, error => { console.log('error'); }); } }

如果不是简单的话,就会出现类似的问题'我使用的模式' hive'。然后我们有多个文件夹,还有空的镶木地板文件抛出

<mat-card> <div class="example-container"> <mat-form-field color="accent"> <input matInput placeholder="Input" [(ngModel)]="name"> </mat-form-field> <button mat-raised-button color="accent" (click)="submit(name)">Submit</button> <mat-spinner *ngIf="loading" color="accent"></mat-spinner> </div> </mat-card>

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

2 个答案:

答案 0 :(得分:0)

Redshift不支持镶木地板格式。 Redshift Spectrum有。雅典娜也支持镶木地板格式。

答案 1 :(得分:0)

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

s3://您的桶/parquet_table/id=1/file1.parquet

s3://您的桶/parquet_table/id=2/file2.parquet

以此类推。

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

位置:s3://您的桶/镶木表

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