S3에 쓰고 난 후 하이브 메타 스토어에 테이블과 파티션을 자동으로 등록하려고하는 작업을하고 있습니다.Spark 데이터 세트에서 하이브 파티션 가져 오기
모든 파티션을 등록하기 전에 모든 파티션 값을 알아야합니다. 이제 모든 파티션 값을 얻으려면 ds.select(partitionColumn).distinct().collectAsList();
을하고 있습니다.
내 데이터 세트에서 파티션 값을 얻는 더 좋은 방법이 있습니까?
S3에 쓰고 난 후 하이브 메타 스토어에 테이블과 파티션을 자동으로 등록하려고하는 작업을하고 있습니다.Spark 데이터 세트에서 하이브 파티션 가져 오기
모든 파티션을 등록하기 전에 모든 파티션 값을 알아야합니다. 이제 모든 파티션 값을 얻으려면 ds.select(partitionColumn).distinct().collectAsList();
을하고 있습니다.
내 데이터 세트에서 파티션 값을 얻는 더 좋은 방법이 있습니까?
을 org.apache.spark.sql.execution.command.ddl.scala
으로 지정하면 Spark 구현은 ALTER TABLE RECOVER PARTITIONS
입니다. 모든 파티션을 스캔 한 다음 등록합니다.
그래서 여기에 같은 아이디어가 있습니다. 방금 작성한 위치의 모든 파티션을 검사하십시오.
키 이름을 가져온 다음 파티션 이름/값을 추출합니다.
다음은 경로를 가져 오는 코드 조각입니다.
String location = "s3n://somebucket/somefolder/dateid=20171010/";
Path root = new Path(location);
Configuration hadoopConf = sparkSession.sessionState().newHadoopConf();
FileSystem fs = root.getFileSystem(hadoopConf);
JobConf jobConf = new JobConf(hadoopConf, this.getClass());
final PathFilter pathFilter = FileInputFormat.getInputPathFilter(jobConf);
FileStatus[] fileStatuses = fs.listStatus(root, path -> {
String name = path.getName();
if (name != "_SUCCESS" && name != "_temporary" && !name.startsWith(".")) {
return pathFilter == null || pathFilter.accept(path);
} else {
return false;
}
});
for(FileStatus fileStatus: fileStatuses) {
System.out.println(fileStatus.getPath().getName());
}
이 접근 방식을 기반으로 추가 작업을 수행하기 위해 현재 필터를 확장 할 수 있습니다. SaveMode가 덮어 쓰기가 아닌 경우 우리가 되돌려주는 경로가 정확히 우리가 작성한 경로가 아니라는 점에서 단점이 있습니다. 필자의 경우 지금은 덮어 쓰기 모드에서만이 옵션을 사용하려고합니다. –
AWS Glue는 이미이 작업을 수행합니다. –
나는 더 나은 해결책을 모르고있다. 내가하는 방식이기도하다. –
@ ThiagoBaldim 우리는 AWS Glue를 보았지만 외부 제품에 대한 metastore 서비스로 사용할 수있는 것처럼 보이지 않는다. Tableau, Databricks 등 ... –