我正在研究在写入S3之后会自动将表和分区注册到hive Metastore的内容。
在我可以注册所有分区之前,我需要知道所有分区值。现在我正在ds.select(partitionColumn).distinct().collectAsList();
来获取所有分区值。
有没有更好的方法从我的数据集中获取分区值?
答案 0 :(得分:1)
在阅读Spark源代码后,特别是AlterTableRecoverPartitionsCommand
中的org.apache.spark.sql.execution.command.ddl.scala
,这是ALTER TABLE RECOVER PARTITIONS
的Spark实现。它扫描所有分区,然后注册它们。
所以,这是同样的想法,扫描我们刚刚写入的位置的所有分区。
从中获取密钥名称,然后从中提取分区名称/值。
以下是获取路径的代码段。
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());
}