〇、相关资料

1、介绍

Presto进阶:内存&数据结构、函数基础_UDF

2、深入理解Presto(1) : Presto的架构

深入理解Presto(1) : Presto的架构_presto 架构-CSDN博客

3、Presto 核心数据结构:Slice、Page、Block

Presto 核心数据结构:Slice、Page、Block-腾讯云开发者社区-腾讯云 (tencent.com)


一、内存&数据结构

1.1 项目搭建

1、项目框架

Presto进阶:内存&数据结构、函数基础_UDF_02

2、引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.liujinhui</groupId>
    <artifactId>presto-udf</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <jdk-version>1.8</jdk-version>
        <presto.version>0.236</presto.version>
        <scope.type>provided</scope.type>
    </properties>
    <dependencies>
        <dependency>
            <groupId>io.airlift</groupId>
            <artifactId>slice</artifactId>
            <version>0.38</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>26.0-jre</version>
        </dependency>
        <dependency>
            <groupId>com.facebook.presto</groupId>
            <artifactId>presto-spi</artifactId>
            <version>${presto.version}</version>
            <scope>${scope.type}</scope>
        </dependency>
        <dependency>
            <groupId>com.facebook.presto</groupId>
            <artifactId>presto-main</artifactId>
            <version>${presto.version}</version>
            <scope>${scope.type}</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>ali-maven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
                <checksumPolicy>fail</checksumPolicy>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>ali-maven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </pluginRepository>
    </pluginRepositories>
    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <!--打包插件-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <finalName>presto-udf</finalName>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${jdk-version}</source>
                    <target>${jdk-version}</target>
                    <encoding>UTF-8</encoding>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

1.2 Slice

1、存储

package com.liujinhui;

import io.airlift.slice.Slice;
import io.airlift.slice.Slices;
import org.junit.Test;

/**
 * @description: 基于内存做查询,需要设置内存空间大小
 * @author: liujinhui
 * @create: 2023/12/22
 */
public class BasicTest {
    /**
     * 测试内容的开发
     * @return
     */
    @Test
    public void test1() {
        // 开辟内存空间,代表设置一块内存区域,大小为10个字节
        // _ ____
        // 8 8888
        // 如果超出内存限定,就会出现内存溢出现象,并且设置字节的值就可能不准
        // 所以设置内存区域字节大小,要计算长度,不能超出
        Slice slice = Slices.allocate(10); // 单独开辟内存区域
        // Byte占1个字节,Int占4个字节
        // 表示第0个字节设置为100,1个字节=8bit,能存2的8次方=256位,最大存256,只能存整数
        slice.setByte(0, 100); // 分别代表起始值(下标),1个字节是8位
        // setBytes而不是setByte
        // Int能存2的32(8*4)次方的数据
        // 获取第0个字节的数据
        System.out.println(slice.getByte(0));
        // 存的值不能超过该字节,否则会报错-能存2的32次方
        slice.setInt(1, 1024*1024*1024); // 3-1073741824
        System.out.println(slice.getInt(1));
        /*slice.setInt(1, 1024*1024*1024*1024); // 3-
        System.out.println(slice.getInt(1));*/
        // 一个中文占3个字节(跟字符集有关,UTF-8是3个),只存不取,可以看到越界现象
        // java.lang.IndexOutOfBoundsException: end index (11) must not be greater than size (10)
        // slice.setBytes(5, "张三".getBytes());
    }
}

2、读取

@Test
public void testRead() {
    Slice slice = Slices.allocate( 15);
    slice.setBytes(5, "张三".getBytes());
    System.out.println(new String(slice.getBytes(5, 6)));
    // 希望替换其中的值
    // 方式:内存复写,原有位置覆盖
    slice.setBytes(8, Slices.utf8Slice("五"));
    // 获取内存中的字符
    byte[] bytes = slice.getBytes(5, 6);
    System.out.println(new String(bytes));
    // slice的set/getBytes有一些重载方法
    // 相当于对内存字符进行截取,假设添加的字符过大,可以对原有的字符进行截取
    slice.setBytes(8, Slices.utf8Slice("六六"), 0, 6);
    System.out.println(new String(slice.getBytes(5, 9)));
}

3、内存地址结合

@Test
public void testRead() {
    Slice slice = Slices.allocate( 15);
    slice.setBytes(5, "张三".getBytes());
    System.out.println(new String(slice.getBytes(5, 6)));
    // 希望替换其中的值
    // 方式:内存复写,原有位置覆盖
    slice.setBytes(8, Slices.utf8Slice("五"));
    // 获取内存中的字符
    byte[] bytes = slice.getBytes(5, 6);
    System.out.println(new String(bytes));
    // slice的set/getBytes有一些重载方法
    // 相当于对内存字符进行截取,假设添加的字符过大,可以对原有的字符进行截取
    slice.setBytes(8, Slices.utf8Slice("六六"), 0, 6);
    System.out.println(new String(slice.getBytes(5, 9)));
}

4、需掌握内容

  • 开辟内存空间大小
  • 合理设置存入数据大小,保证别越界超出内存

setBytes而不是setByte

  • 内存地址结合使用

UTF8一个中文/中文标点占三个字节,英文字符/英文标点占一个字节

Unicode一个英文占2个字节,一个中文也占2个字节

1.3 数据模型

catalog 对应某一类数据源,例如hive的数据,或mysql的数据

schema 对应mysql中的数据库

table 对应mysql中的表

Presto进阶:内存&数据结构、函数基础_Presto_03

1.4 存储单元

presto的存储单元包括:

Page: 多行数据的集合,包含多个列的数据,内部仅提供逻辑行,实际以列式存储。

Block:一列数据,根据不同类型的数据,通常采取不同的编码方式,了解这些编码方式,有助于自己的存储系统对接presto。

Presto进阶:内存&数据结构、函数基础_Slice_04



二、函数基础

2.1 查看函数

按z翻页

Presto进阶:内存&数据结构、函数基础_Presto_05

Presto进阶:内存&数据结构、函数基础_Presto_06

2.2 函数分类

名称

解释

自定义

scalar

标量函数

UDF

aggregate

聚合函数

UDAF

scala/scalable-灵活的、可伸缩的

scalar标量

2.3 函数使用

1、调用presto函数

Presto进阶:内存&数据结构、函数基础_Slice_07

2、自定义函数

参考:大数据Presto(四):Presto自定义函数和JDBC连接-腾讯云开发者社区-腾讯云 (tencent.com)