〇、相关资料
1、介绍
2、深入理解Presto(1) : Presto的架构
深入理解Presto(1) : Presto的架构_presto 架构-CSDN博客
3、Presto 核心数据结构:Slice、Page、Block
Presto 核心数据结构:Slice、Page、Block-腾讯云开发者社区-腾讯云 (tencent.com)
一、内存&数据结构
1.1 项目搭建
1、项目框架
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中的表
1.4 存储单元
presto的存储单元包括:
Page: 多行数据的集合,包含多个列的数据,内部仅提供逻辑行,实际以列式存储。
Block:一列数据,根据不同类型的数据,通常采取不同的编码方式,了解这些编码方式,有助于自己的存储系统对接presto。
二、函数基础
2.1 查看函数
按z翻页
2.2 函数分类
名称 | 解释 | 自定义 |
scalar | 标量函数 | UDF |
aggregate | 聚合函数 | UDAF |
scala/scalable-灵活的、可伸缩的
scalar标量
2.3 函数使用
1、调用presto函数
2、自定义函数
参考:大数据Presto(四):Presto自定义函数和JDBC连接-腾讯云开发者社区-腾讯云 (tencent.com)