从Spark数据集中获取hive分区

时间:2017-10-12 01:45:12

标签: apache-spark hive

我正在研究在写入S3之后会自动将表和分区注册到hive Metastore的内容。

在我可以注册所有分区之前,我需要知道所有分区值。现在我正在ds.select(partitionColumn).distinct().collectAsList();来获取所有分区值。

有没有更好的方法从我的数据集中获取分区值?

1 个答案:

答案 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());
}