【大數據】Flink SQL 語法篇(五):Regular Join、Interval Join

Flink SQL 語法篇》系列,共包含以下 10 篇文章:

  • Flink SQL 語法篇(一):CREATE
  • Flink SQL 語法篇(二):WITH、SELECT & WHERE、SELECT DISTINCT
  • Flink SQL 語法篇(三):窗口聚合(TUMBLE、HOP、SESSION、CUMULATE)
  • Flink SQL 語法篇(四):Group 聚合、Over 聚合
  • Flink SQL 語法篇(五):Regular Join、Interval Join
  • Flink SQL 語法篇(六):Temporal Join
  • Flink SQL 語法篇(七):Lookup Join、Array Expansion、Table Function
  • Flink SQL 語法篇(八):集合、Order By、Limit、TopN
  • Flink SQL 語法篇(九):Window TopN、Deduplication
  • Flink SQL 語法篇(十):EXPLAIN、USE、LOAD、SET、SQL Hints

😊 如果您覺得這篇文章有用 ?? 的話,請給博主一個一鍵三連 🚀🚀🚀 吧 (點贊 🧡、關注 💛、收藏 💚)!!!您的支持 💖💖💖 將激勵 🔥 博主輸出更多優質內容!!!

Flink SQL 語法篇(五):Regular Join、Interval Join

  • 1.Regular Join
    • 1.1 Inner Join 案例
    • 1.2 Left Join 案例
    • 1.3 Full Join 案例
  • 2.Interval Join(時間區間 Join)
    • 2.1 Inner Interval Join
    • 2.2 Left Interval Join
    • 2.3 Full Interval Join

Flink 也支持了非常多的數據 Join 方式,主要包括以下三種:

  • 動態表(流)與動態表(流)的 Join
  • 動態表(流)與外部維表(比如 Redis)的 Join
  • 動態表字段的列轉行(一種特殊的 Join)

細分 Flink SQL 支持的 Join:

  • Regular Join:流與流的 Join,包括 Inner Equal Join、Outer Equal Join
  • Interval Join:流與流的 Join,兩條流一段時間區間內的 Join
  • Temporal Join:流與流的 Join,包括事件時間,處理時間的 Temporal Join,類似于離線中的快照 Join
  • Lookup Join:流與外部維表的 Join
  • Array Expansion:表字段的列轉行,類似于 Hive 的 explode 數據炸開的列轉行
  • Table Function:自定義函數的表字段的列轉行,支持 Inner Join 和 Left Outer Join

1.Regular Join

Regular Join 定義(支持 Batch / Streaming):Regular Join 其實就是和離線 Hive SQL 一樣的 Regular Join,通過條件關聯兩條流數據輸出

應用場景:Join 其實在我們的數倉建設過程中應用是非常廣泛的。離線數倉可以說基本上是離不開 Join 的。那么實時數倉的建設也必然離不開 Join,比如日志關聯擴充維度數據,構建寬表;日志通過 ID 關聯計算 CTR。

Regular Join 包含以下幾種(以 L 作為左流中的數據標識,R 作為右流中的數據標識):

  • Inner JoinInner Equal Join):流任務中,只有兩條流 Join 到才輸出,輸出 +[L, R]
  • Left JoinOuter Equal Join):流任務中,左流數據到達之后,無論有沒有 Join 到右流的數據,都會輸出(Join 到輸出 +[L, R],沒 Join 到輸出 +[L, null]),如果右流之后數據到達之后,發現左流之前輸出過沒有 Join 到的數據,則會發起回撤流,先輸出 -[L, null],然后輸出 +[L, R]
  • Right JoinOuter Equal Join):有 Left Join 一樣,左表和右表的執行邏輯完全相反。
  • Full JoinOuter Equal Join):流任務中,左流或者右流的數據到達之后,無論有沒有 Join 到另外一條流的數據,都會輸出(對右流來說:Join 到輸出 +[L, R],沒 Join 到輸出 +[null, R];對左流來說:Join 到輸出 +[L, R],沒 Join 到輸出 +[L, null])。如果一條流的數據到達之后,發現之前另一條流之前輸出過沒有 Join 到的數據,則會發起回撤流(左流數據到達為例:回撤 -[null, R],輸出 +[L, R],右流數據到達為例:回撤 -[L, null],輸出 +[L, R])。

1.1 Inner Join 案例

實際案例:案例為 曝光日志 關聯 點擊日志 篩選既有曝光又有點擊的數據。

-- 曝光日志數據
CREATE TABLE show_log_table (log_id BIGINT,show_params STRING
) WITH ('connector' = 'datagen','rows-per-second' = '2','fields.show_params.length' = '1','fields.log_id.min' = '1','fields.log_id.max' = '100'
);-- 點擊日志數據
CREATE TABLE click_log_table (log_id BIGINT,click_params STRING
)
WITH ('connector' = 'datagen','rows-per-second' = '2','fields.click_params.length' = '1','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE sink_table (s_id BIGINT,s_params STRING,c_id BIGINT,c_params STRING
) WITH ('connector' = 'print'
);-- 流的 INNER JOIN,條件為 log_id
INSERT INTO sink_table
SELECTshow_log_table.log_id as s_id,show_log_table.show_params as s_params,click_log_table.log_id as c_id,click_log_table.click_params as c_params
FROM show_log_table
INNER JOIN click_log_table ON show_log_table.log_id = click_log_table.log_id;

輸出結果如下:

+I[5, d, 5, f]
+I[5, d, 5, 8]
+I[5, d, 5, 2]
+I[3, 4, 3, 0]
+I[3, 4, 3, 3]
...

1.2 Left Join 案例

CREATE TABLE show_log_table (log_id BIGINT,show_params STRING
) WITH ('connector' = 'datagen','rows-per-second' = '1','fields.show_params.length' = '3','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE click_log_table (log_id BIGINT,click_params STRING
)
WITH ('connector' = 'datagen','rows-per-second' = '1','fields.click_params.length' = '3','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE sink_table (s_id BIGINT,s_params STRING,c_id BIGINT,c_params STRING
) WITH ('connector' = 'print'
);INSERT INTO sink_table
SELECTshow_log_table.log_id as s_id,show_log_table.show_params as s_params,click_log_table.log_id as c_id,click_log_table.click_params as c_params
FROM show_log_table
LEFT JOIN click_log_table ON show_log_table.log_id = click_log_table.log_id;

輸出結果如下:

+I[5, f3c, 5, c05]
+I[5, 6e2, 5, 1f6]
+I[5, 86b, 5, 1f6]
+I[5, f3c, 5, 1f6]
-D[3, 4ab, null, null]
-D[3, 6f2, null, null]
+I[3, 4ab, 3, 765]
+I[3, 6f2, 3, 765]
+I[2, 3c4, null, null]
+I[3, 4ab, 3, a8b]
+I[3, 6f2, 3, a8b]
+I[2, c03, null, null]
...

1.3 Full Join 案例

CREATE TABLE show_log_table (log_id BIGINT,show_params STRING
) WITH ('connector' = 'datagen','rows-per-second' = '2','fields.show_params.length' = '1','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE click_log_table (log_id BIGINT,click_params STRING
)
WITH ('connector' = 'datagen','rows-per-second' = '2','fields.click_params.length' = '1','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE sink_table (s_id BIGINT,s_params STRING,c_id BIGINT,c_params STRING
) WITH ('connector' = 'print'
);INSERT INTO sink_table
SELECTshow_log_table.log_id as s_id,show_log_table.show_params as s_params,click_log_table.log_id as c_id,click_log_table.click_params as c_params
FROM show_log_table
FULL JOIN click_log_table ON show_log_table.log_id = click_log_table.log_id;

輸出結果如下:

+I[null, null, 7, 6]
+I[6, 5, null, null]
-D[1, c, null, null]
+I[1, c, 1, 2]
+I[3, 1, null, null]
+I[null, null, 7, d]
+I[10, 0, null, null]
+I[null, null, 2, 6]
-D[null, null, 7, 6]
-D[null, null, 7, d]
...

關于 Regular Join 的注意事項:

  • 實時 Regular Join 可以不是 等值 Join等值 Join非等值 Join 區別在于,等值 Join 數據 Shuffle 策略是 Hash,會按照 Join on 中的等值條件作為 id 發往對應的下游;非等值 Join 數據 Shuffle 策略是 Global,所有數據發往一個并發,按照非等值條件進行關聯。
  • Join 的流程是左流新來一條數據之后,會和右流中符合條件的所有數據做 Join,然后輸出。
  • 流的上游是無限的數據,所以要做到關聯的話,Flink 會將兩條流的所有數據都存儲在 State 中,所以 Flink 任務的 State 會無限增大,因此你需要為 State 配置合適的 TTL,以防止 State 過大。

2.Interval Join(時間區間 Join)

Interval Join 定義(支持 Batch / Streaming):Interval Join 在離線的概念中是沒有的。Interval Join 可以讓一條流去 Join 另一條流中前后一段時間內的數據。

應用場景:為什么有 Regular Join 還要 Interval Join 呢?剛剛的案例也講了,Regular Join 會產生 回撤流,但是在實時數倉中一般寫入的 Sink 都是類似于 Kafka 這樣的消息隊列,然后后面接 Clickhouse 等引擎,這些引擎又不具備處理回撤流的能力。所以博主理解 Interval Join 就是用于消滅回撤流的。

Interval Join 包含以下幾種(以 L 作為左流中的數據標識,R 作為右流中的數據標識):

  • Inner Interval Join:流任務中,只有兩條流 Join 到(滿足 Join on 中的條件:兩條流的數據在時間區間 + 滿足其他等值條件)才輸出,輸出 +[L, R]
  • Left Interval Join:流任務中,左流數據到達之后,如果沒有 Join 到右流的數據,就會等待(放在 State 中等),如果之后右流之后數據到達之后,發現能和剛剛那條左流數據 Join 到,則會輸出 +[L, R]。事件時間中隨著 Watermark 的推進(也支持處理時間)。如果發現發現左流 State 中的數據過期了,就把左流中過期的數據從 State 中刪除,然后輸出 +[L, null],如果右流 State 中的數據過期了,就直接從 State 中刪除。
  • Right Interval Join:和 Left Interval Join 執行邏輯一樣,只不過左表和右表的執行邏輯完全相反
  • Full Interval Join:流任務中,左流或者右流的數據到達之后,如果沒有 Join 到另外一條流的數據,就會等待(左流放在左流對應的 State 中等,右流放在右流對應的 State 中等),如果之后另一條流數據到達之后,發現能和剛剛那條數據 Join 到,則會輸出 +[L, R]。事件時間中隨著 Watermark 的推進(也支持處理時間),發現 State 中的數據過期了,就將這些數據從 State 中刪除并且輸出(左流過期輸出 +[L, null],右流過期輸出 +[null, R]

可以發現 Inner Interval Join 和其他三種 Outer Interval Join 的區別在于,Outer 在隨著時間推移的過程中,如果有數據過期了之后,會根據是否是 Outer 將沒有 Join 到的數據也給輸出。

2.1 Inner Interval Join

實際案例:還是剛剛的案例,曝光日志 關聯 點擊日志 篩選既有曝光又有點擊的數據,條件是曝光關聯之后發生 4 4 4 小時之內的點擊。

CREATE TABLE show_log_table (log_id BIGINT,show_params STRING,row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),WATERMARK FOR row_time AS row_time
) WITH ('connector' = 'datagen','rows-per-second' = '1','fields.show_params.length' = '1','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE click_log_table (log_id BIGINT,click_params STRING,row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),WATERMARK FOR row_time AS row_time
)
WITH ('connector' = 'datagen','rows-per-second' = '1','fields.click_params.length' = '1','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE sink_table (s_id BIGINT,s_params STRING,c_id BIGINT,c_params STRING
) WITH ('connector' = 'print'
);INSERT INTO sink_table
SELECTshow_log_table.log_id as s_id,show_log_table.show_params as s_params,click_log_table.log_id as c_id,click_log_table.click_params as c_params
FROM show_log_table INNER JOIN click_log_table ON show_log_table.log_id = click_log_table.log_id
AND show_log_table.row_time BETWEEN click_log_table.row_time - INTERVAL '4' HOUR AND click_log_table.row_time;

輸出結果如下:

6> +I[2, a, 2, 6]
6> +I[2, 6, 2, 6]
2> +I[4, 1, 4, 5]
2> +I[10, 8, 10, d]
2> +I[10, 7, 10, d]
2> +I[10, d, 10, d]
2> +I[5, b, 5, d]
6> +I[1, a, 1, 7]

2.2 Left Interval Join

CREATE TABLE show_log (log_id BIGINT,show_params STRING,row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),WATERMARK FOR row_time AS row_time
) WITH ('connector' = 'datagen','rows-per-second' = '1','fields.show_params.length' = '1','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE click_log (log_id BIGINT,click_params STRING,row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),WATERMARK FOR row_time AS row_time
)
WITH ('connector' = 'datagen','rows-per-second' = '1','fields.click_params.length' = '1','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE sink_table (s_id BIGINT,s_params STRING,c_id BIGINT,c_params STRING
) WITH ('connector' = 'print'
);INSERT INTO sink_table
SELECTshow_log.log_id as s_id,show_log.show_params as s_params,click_log.log_id as c_id,click_log.click_params as c_params
FROM show_log LEFT JOIN click_log ON show_log.log_id = click_log.log_id
AND show_log.row_time BETWEEN click_log.row_time - INTERVAL '5' SECOND AND click_log.row_time + INTERVAL '5' SECOND;

輸出結果如下:

+I[6, e, 6, 7]
+I[11, d, null, null]
+I[7, b, null, null]
+I[8, 0, 8, 3]
+I[13, 6, null, null]

2.3 Full Interval Join

CREATE TABLE show_log (log_id BIGINT,show_params STRING,row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),WATERMARK FOR row_time AS row_time
) WITH ('connector' = 'datagen','rows-per-second' = '1','fields.show_params.length' = '1','fields.log_id.min' = '5','fields.log_id.max' = '15'
);CREATE TABLE click_log (log_id BIGINT,click_params STRING,row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),WATERMARK FOR row_time AS row_time
)
WITH ('connector' = 'datagen','rows-per-second' = '1','fields.click_params.length' = '1','fields.log_id.min' = '1','fields.log_id.max' = '10'
);CREATE TABLE sink_table (s_id BIGINT,s_params STRING,c_id BIGINT,c_params STRING
) WITH ('connector' = 'print'
);INSERT INTO sink_table
SELECTshow_log.log_id as s_id,show_log.show_params as s_params,click_log.log_id as c_id,click_log.click_params as c_params
FROM show_log LEFT JOIN click_log ON show_log.log_id = click_log.log_id
AND show_log.row_time BETWEEN click_log.row_time - INTERVAL '5' SECOND AND click_log.row_time + INTERVAL '5' SECOND;

輸出結果如下:

+I[6, 1, null, null]
+I[7, 3, 7, 8]
+I[null, null, 6, 6]
+I[null, null, 4, d]
+I[8, d, null, null]
+I[null, null, 3, b]

關于 Interval Join 的注意事項:

  • 實時 Interval Join 可以不是 等值 Join等值 Join非等值 Join 區別在于,等值 Join 數據 Shuffle 策略是 Hash,會按照 Join on 中的等值條件作為 id 發往對應的下游;非等值 Join 數據 Shuffle 策略是 Global,所有數據發往一個并發,然后將滿足條件的數據進行關聯輸出。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711635.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu系統下大數據服務器磁盤調優測試記錄

一、背景 在kvm虛擬機ubuntu操作系統大數據平臺測試的過程中,遭遇了磁盤I/O性能的瓶頸,因有cpu綁核操作,故有做隔核操作驗證是否是綁核影響的磁盤I/O,后又對磁盤進行透傳以及掛內存盤等操作; 二、磁盤介紹 2.1 磁盤…

『NLP學習筆記』圖解 BERT、ELMo和GPT(NLP如何破解遷移學習)

圖解 BERT、ELMo和GPT(NLP如何破解遷移學習) 文章目錄 一. 前言二. 示例-句子分類三. 模型架構3.1. 模型輸入3.2. 模型輸出四. BERT VS卷積神經網絡五. 詞嵌入新時代5.1. 簡要回顧詞嵌入Word Embedding5.2. ELMo: 上下文語境很重要5.2.1. ELMo的秘密是什么?5.3. ULM-FiT:將遷…

藍橋杯Python B組練習——斐波那契數列

一、題目 定義 斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家萊昂納多斐波那契(Leonardo Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數…

Linux x86平臺獲取sys_call_table

文章目錄 前言一、根據call *sys_call_table來獲取二、使用dump_stack三、根據MSR_LSTAR寄存器四、使用sys_close參考資料 前言 Linux 3.10.0 – x86_64 最簡單獲取sys_call_table符號的方法: # cat /proc/kallsyms | grep sys_call_table ffffffff816beee0 R sy…

隨想錄算法訓練營第四十七天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 public class Solution {public int Rob(int[] nums) {if(nums.Length0){return 0;}if(nums.Length1){return nums[0];}int[] dpnew int[nums.Length1];dp[0]nums[0];dp[1]Math.Max(nums[0],nums[1]);for(int i2;i<nums.Length;i){dp[i]Math.Max(dp[i-2]nums[…

什么是 HTTPS 證書?作用是什么?

HTTPS 證書&#xff0c;即超文本傳輸安全協議證書&#xff08;Hypertext Transfer Protocol Secure&#xff09;&#xff0c;是網站安全的關鍵組成部分。它通過 SSL/TLS 加密協議&#xff0c;確保用戶與網站之間的數據傳輸是加密和安全的。 什么是 HTTPS 證書&#xff1f; HT…

使用Docker -compose啟動自定義jar包

步驟1&#xff1a;編寫docker-compose.yml文件 首先我們需要編寫一個docker-compose.yml文件來定義我們的服務傳到我們的云服務器上 以下是一個示例&#xff1a; version: 3 services:app:build:context: .dockerfile: Dockerfileports:- 8080:8080volumes:- ./app.jar:/app…

可視化圖表:水球圖,展示百分比的神器。

Hi&#xff0c;我是貝格前端工場的老司機&#xff0c;本文分享可視化圖表設計的水球圖設計&#xff0c;歡迎老鐵持續關注我們。 一、水球圖及其作用 水球圖是一種特殊的可視化圖表&#xff0c;它主要用于展示百分比或比例的數據&#xff0c;并以水球的形式進行呈現。水球圖的作…

2023面試題

目錄 題目 1:JVM 整體結構是什么樣的? 8 題目 3:Object 類有哪些方法? 11 題目 4:靜態變量與實例變量區別? 11 題目 5:String 類的常用方法有哪些? 11 題目 6:數組有沒有 length()方法?String 有沒有 length() 12 題目 7:String、StringBuffer、StringBuilder 的區別…

【k8s 訪問控制--認證與鑒權】

1、身份認證與權限 前面我們在操作k8s的所有請求都是通過https的方式進行請求&#xff0c;通過REST協議操作我們的k8s接口&#xff0c;所以在k8s中有一套認證和鑒權的資源。 Kubenetes中提供了良好的多租戶認證管理機制&#xff0c;如RBAC、ServiceAccount還有各種策路等。通…

集合篇之ArrayList

一、源碼如何分析&#xff1f; 1.成員變量 2.構造方法 3.關鍵方法 一些添加的方法。 二、debug看源碼 我們給出下面代碼&#xff1a; public void test01() {ArrayList<Integer> list new ArrayList<>();list.add(1);for (int i 2; i < 10; i) {list.add(i…

H5:段落標簽與換行標簽

目錄 一.前言 二.正文 1.段落標簽 2.換行標簽 三.結語 一.前言 學習前端&#xff0c;從此起飛&#xff0c;愿你堅持&#xff0c;直至等頂。 二.正文 1.段落標簽 <p></p> p為段落標簽&#xff0c;由英文paragraph簡寫而來&#xff0c;用于將一段某一部分文本&am…

算法練習第九天|232.用棧實現隊列、225. 用隊列實現棧

熟悉棧和隊列的方法&#xff1b;熟悉棧和隊列的數據結構&#xff0c;不涉及算法 232.用棧實現隊列 import java.util.Stack; class MyQueue {//負責進棧的Stack<Integer> stackIn;//負責出棧的Stack<Integer> stackOut;public MyQueue() {stackIn new Stack<&…

Rocketmq 入門介紹

從零手寫實現 mq 詳細介紹一下 rocketmq RocketMQ 是由阿里巴巴開發的分布式消息隊列系統&#xff0c;它是一個低延遲、高可靠、高吞吐量的消息中間件。 RocketMQ 最初是作為阿里巴巴的內部項目進行開發的&#xff0c;后來成為了 Apache 軟件基金會下的頂級項目&#xff0c;以…

精讀《React 高階組件》

本期精讀文章是&#xff1a;React Higher Order Components in depth 1 引言 高階組件&#xff08; higher-order component &#xff0c;HOC &#xff09;是 React 中復用組件邏輯的一種進階技巧。它本身并不是 React 的 API&#xff0c;而是一種 React 組件的設計理念&…

【QT+QGIS跨平臺編譯】之五十三:【QGIS_CORE跨平臺編譯】—【qgssqlstatementparser.cpp生成】

文章目錄 一、Bison二、生成來源三、構建過程一、Bison GNU Bison 是一個通用的解析器生成器,它可以將注釋的無上下文語法轉換為使用 LALR (1) 解析表的確定性 LR 或廣義 LR (GLR) 解析器。Bison 還可以生成 IELR (1) 或規范 LR (1) 解析表。一旦您熟練使用 Bison,您可以使用…

transformers文本相似度

在自然語言處理(NLP)中,文本相似度是衡量兩個文本之間語義或結構相似程度的一個重要概念。計算文本相似度的方法多種多樣,適應不同的應用場景和需求。以下是一些常見的文本相似度計算方法: 1、余弦相似度: 通過將文本轉換為向量表示(例如,使用詞袋模型、TF-IDF 或 wor…

2024年個人護理賽道選品風向在哪?這份賽盈分銷選品攻略必看!

2024年還會卷下去嗎&#xff1f;看到一位行業大佬分享的內容深有感觸&#xff1a;堅定做好產品&#xff0c;不做大賣&#xff0c;就不存在卷不卷。 有人出局&#xff0c;也會有人入局&#xff0c;并且深耕領域做大做強。 專注口腔護理的Bitvae入行不到兩年&#xff0c;憑借一款…

C#學習(十四)——垃圾回收、析構與IDisposable

一、何為GC 數據是存儲在內存中的&#xff0c;而內存又分為Stack棧內存和Heap堆內存 Stack棧內存Heap堆內存速度快、效率高結構復雜類型、大小有限制對象只能保存簡單的數據引用數據類型基礎數據類型、值類型- 舉個例子 var c new Customer{id: 123,name: "Jack"…

Java中String類有哪些常用方法?

Java中的String類提供了許多有用的方法&#xff0c;用于處理字符串。以下是一些常用的方法及其簡要描述&#xff1a; 1. **charAt(int index)**&#xff1a;返回指定位置的字符。 2. **length()**&#xff1a;返回字符串的長度。 3. **substring(int beginIndex, int endInd…