Presto查询Hive表最大分区数的两种方式

环境说明

PRESTO VERSION 0.207

查询方式
  • 使用SQL直接查询
---- 客户端查询 presto --server localhost:8888 --catalog hive --schema default
select max(pt) FROM hive.ods."ods_parents_df$partitions";
   _col0
------------
 2020-08-14
(1 row)

----JDBC查询
select max(pt) FROM ods."ods_lesson_df$partitions"
  • 注册Presto函数查询
public class MaxPt {
    @ScalarFunction("max_pt")
    @Description("获取hive最大分区")
    @SqlType(StandardTypes.VARCHAR)
    public static Slice parse(@SqlType(StandardTypes.VARCHAR) Slice input) throws TException, IOException {
        String uat_uris = "thrift://xxxx03:9083";
        String value = input.toStringUtf8();
        if (value.length() != 0) {
            return Slices.utf8Slice("The input can not be null");
        }
        if (!value.contains("\\.") || value.split("\\.").length != 2) {
            return Slices.utf8Slice("The input error, " + value);
        }
        String hiveDb = value.split("\\.")[0];
        String hiveTable = value.split("\\.")[1];

        HiveConf hiveConf = new HiveConf();
        hiveConf.setVar(HiveConf.ConfVars.METASTOREURIS, uat_uris);
        IMetaStoreClient client = new HiveMetaStoreClient(hiveConf);
        List<Partition> listPartitions = client.listPartitions(hiveDb, hiveTable, Short.MAX_VALUE);
        String pt = Collections.max(listPartitions).getValues().get(0);
        return Slices.utf8Slice(pt);
}

注册函数:

public class UdfPlugin implements Plugin {
    @Override
    public Set<Class<?>> getFunctions() {
        return ImmutableSet.<?>>builder()
                .add(MaxPt.class)
                .build();
    }
}

重启presto服务后show functions查看函数是否注册成功。

你可能感兴趣的:(Hadoop)