我正在尝试创建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中构建它们的建议?
答案 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中的数据按上述方式进行分区,则不会遇到任何问题。