2017-10-12 2 views
0

S3에 쓰고 난 후 하이브 메타 스토어에 테이블과 파티션을 자동으로 등록하려고하는 작업을하고 있습니다.Spark 데이터 세트에서 하이브 파티션 가져 오기

모든 파티션을 등록하기 전에 모든 파티션 값을 알아야합니다. 이제 모든 파티션 값을 얻으려면 ds.select(partitionColumn).distinct().collectAsList();을하고 있습니다.

내 데이터 세트에서 파티션 값을 얻는 더 좋은 방법이 있습니까?

+0

AWS Glue는 이미이 작업을 수행합니다. –

+0

나는 더 나은 해결책을 모르고있다. 내가하는 방식이기도하다. –

+0

@ ThiagoBaldim 우리는 AWS Glue를 보았지만 외부 제품에 대한 metastore 서비스로 사용할 수있는 것처럼 보이지 않는다. Tableau, Databricks 등 ... –

답변

0

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()); 
} 
+0

이 접근 방식을 기반으로 추가 작업을 수행하기 위해 현재 필터를 확장 할 수 있습니다. SaveMode가 덮어 쓰기가 아닌 경우 우리가 되돌려주는 경로가 정확히 우리가 작성한 경로가 아니라는 점에서 단점이 있습니다. 필자의 경우 지금은 덮어 쓰기 모드에서만이 옵션을 사용하려고합니다. –

관련 문제