Presto Procedure

简介: ![procedure.jpg](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/f3c2b2a1780cd9a2f46453a0de82c04d.jpg) ## 概述 Presto里面有个类似普通数据库存储过程的东西叫做 `Procedure`(https://prestosql.io/docs/current/sql/call.ht

procedure.jpg

概述

Presto里面有个类似普通数据库存储过程的东西叫做 Procedure, 它的主要作用是用来提供一下DDL或者管理性的工作,它的用法跟MySQL里面的存储过程类似,比如:

-- 调用一个两个参数的存储过程
CALL test(123, 'apple');

-- 支持named arguments
CALL test(
    name => 'apple', 
    id => 123
);
虽然名字叫Procedure,但是你无法通过Presto的CALL语法来调用底层RDBMS里面的存储过程,概念类似,但是不是一个层面的东西,Presto里面能CALL的Procedure是需要Connector注册的。

开发一个Procedure

我们来看一下一个Procedure包含哪些部分:

/** 属于哪个schema */
private final String schema;
/** 名字叫什么 */
private final String name;
/** 有哪些参数?每个参数的名称、类型是什么? */
private final List<Argument> arguments;
/** 由哪个方法实现? */
private final MethodHandle methodHandle;
...

从上面Procedure的结构可以看出,真正要做的实现一个方法(MethodHandle)就好了,比如我们要drop一个hive partition,它大概的逻辑是这样的:

    public void dropPartition(
        ConnectorSession session, 
        String schema, String table,
        List<Object> partitionColNames, 
        List<Object> partitionValues)
    {
        metastore.dropPartition(
            schema, table, 
            partitionValues, false
        );
    }

正式声明这个drop_partitionProcedure的代码是这样的:

new Procedure(
    "system",
    "drop_partition",
    ImmutableList.of(
        new Argument("schema", VARCHAR),
        new Argument("table", VARCHAR),
        new Argument(
            "partitionColumnNames", 
            "array(varchar)"
        ),
        new Argument(
            "partitionValues", 
            "array(varchar)"
        )
    ),
    methodHandle(
        DemoProcedure.class,
        "dropPartition",
        ConnectorSession.class,
        String.class,
        String.class,
        List.class,
        List.class
    ).bindTo(this)
);

从上面两段代码我们可以很清楚的看出:

  • 它的名字叫 drop_partition
  • 它有4个参数,前两个参数名字分别叫schematable,类型都是 VARCHAR
  • 它的具体的逻辑是由 DemoProcedure 里面的 dropPartition 来实现的(也就是上面第一段代码)。

细心的同学可能注意到了,这个 dropPartition 还有一个 ConnectorSession 类型的参数呀,怎么没有声明出来?没错,不过这个参数不用显式声明给Procedure的使用者,ConnectorSession里面包含调用这个Procedure时候的一些上下文信息,Presto在调用对应MethodHandle的时候发现这种类型的参数会自动传过来。

开发完成之后通过 com.facebook.presto.spi.connector.Connector#getProcedures 暴露出去就可以调用了。

Procedure的实际使用场景

前面也说过Procedure的使用场景是一些DDL以及管理性的工作,一个典型的例子就是处理Hive Connector里面 drop table/drop partition的工作,我们知道Hive是有自己的Hive Meta Store的,要实现drop partition,一个不经意的想法是直接利用HiveCli去Hive Meta Store上面去drop,但是这样会有问题, 原因在于 Presto 里面对于Hive Meta Store里面的元数据是有缓存的,直接操作Hive Meta Store会使得Presto里面的元数据缓存没有及时失效掉,导致用户通过Presto查询Hive数据得到错误的结果, 如下图:

Presto Cache Issue

这时候Procedure就可以派上用场了,利用我们前面介绍的drop_partition, 我们可以通过如下的命令去“彻底地”删除一个partition了:

CALL system.hive.drop_partition(
    'db001', 'table001', 
    ARRAY['dt'], ARRAY['bar']
);

让用户直接用这种语句去删除partition当然很傻,你可以稍微包装一下,用户写SQL: alter table db001.table001 drop partition(dt = 'bar'), 你背后自动调用 drop_partition 即可。

当然,通过Procedure来解决Presto Connector内部的缓存问题也不是理想的方案,但是是目前Presto框架下比较现实的方案。理想的方案应该让Presto通过SPI层面暴露出接口来做这种事情。

总结

今天介绍了Presto里面的Procedure, 可以用它来做一些DDL以及管理的事情,因为是Presto内置提供的机制,做起事情来比较“合规”,有需要的场景不妨试试。

目录
相关文章
|
缓存 网络协议 算法
计算机网络常见面试题目总结,含答案
计算机网络常见面试题目总结,含答案
|
前端开发 Java
Java下载多个文件打成压缩包返回输出流,并解决被JVM占用无法打开
Java下载多个文件打成压缩包返回输出流,并解决被JVM占用无法打开
1003 0
Java下载多个文件打成压缩包返回输出流,并解决被JVM占用无法打开
|
Android开发 数据格式 XML
Android FrameLayout子view居中(左居中,右居中)等
Android的布局FrameLayout默认是把布局内的子view堆砌在左上角,但是,可以通过设置子view的: android:layout_gravity 此参数控制子view的布局位置,实现FrameLayou...
2857 0
|
JavaScript 前端开发
QML中的Date将时间戳和指定格式时间互转
QML中的Date将时间戳和指定格式时间互转
471 0
|
人工智能
写歌词的技巧和方法:打造完美歌词结构,妙笔生词AI智能写歌词软件
写歌词的技巧包括:开头吸引人,主体逻辑清晰,结尾画龙点睛。使用《妙笔生词智能写歌词软件》的AI功能,如智能写词、押韵优化等,可助你克服创作瓶颈,打造完美歌词结构,适用于民谣、摇滚、流行等多种风格。
|
人工智能 小程序
【一步步开发AI运动小程序】七、进行运动计时、计数
随着AI技术的发展,阿里体育推出的“乐动力”、“天天跳绳”等APP,使云上运动会、AI体育指导等概念备受关注。本文将引导您从零开始,利用“云智AI运动识别小程序插件”,在小程序中实现类似功能。通过插件的`sports`和`calc`命名空间,可轻松实现运动检测、计时计数等功能。示例代码展示了如何创建并使用俯卧撑运动分析器,以及如何通过摄像头捕获图像进行人体识别和运动分析。敬请期待后续关于姿态分析的内容。
|
Python
Python中break详解以及用法
`break`语句在Python中用于提前结束循环。当遇到`break`时,循环立即停止,程序跳至循环体外继续执行。它适用于`for`和`while`循环,常与条件判断结合,满足特定条件即中断循环。示例展示了在不同循环中使用`break`的情况。注意,`break`只能用于循环且仅终止最内层循环,会导致循环中的`else`语句不执行。它是控制程序流程的有效工具,但需谨慎使用。
1604 1
|
运维 安全 SDN
网络拓扑设计与优化:构建高效稳定的网络架构
【8月更文挑战第17天】网络拓扑设计与优化是一个复杂而重要的过程,需要综合考虑多方面因素。通过合理的拓扑设计,可以构建出高效稳定的网络架构,为业务的顺利开展提供坚实的支撑。同时,随着技术的不断进步和业务需求的不断变化,网络拓扑也需要不断优化和调整,以适应新的挑战和机遇。
1025 1
|
网络协议 安全 物联网
|
XML 编解码 Android开发
Android Studio App开发入门之图形定制Drawable的讲解及实战(附源码 超详细必看)
Android Studio App开发入门之图形定制Drawable的讲解及实战(附源码 超详细必看)
407 1

热门文章

最新文章