FlinkSQL自定義函數開發

来源:https://www.cnblogs.com/wxm2270/archive/2023/03/31/17275442.html
-Advertisement-
Play Games

本次需求場景主要為實現將flinksql中collect()函數輸出的Mutiset(VARCHAR<100>)多行結果轉換為字元串。 一、FlinkSQL自定義函數分類 Flink SQL 的自定義函數是用戶可以自行編寫的一種函數,用於擴展 Flink SQL 的功能。自定義函數可以在 SQL 查 ...


本次需求場景主要為實現將flinksql中collect()函數輸出的Mutiset(VARCHAR<100>)多行結果轉換為字元串。

一、FlinkSQL自定義函數分類

Flink SQL 的自定義函數是用戶可以自行編寫的一種函數,用於擴展 Flink SQL 的功能。自定義函數可以在 SQL 查詢中被調用,以完成用戶自定義的數據處理邏輯。 在 Flink SQL 中,自定義函數分為標量函數、表函數和聚合函數三種類型。

1、標量函數(Scalar Function)

標量函數接受一行輸入,返回一行輸出。常見的標量函數有字元串函數、數學函數等。用戶可以通過繼承 ScalarFunction 類或實現 ScalarFunction 介面的方式來實現自定義的標量函數。

2、表函數(Table Function)

表函數接受一行輸入,返回多行輸出。在 Flink SQL 中,表函數可以使用 LATERAL TABLE 語法進行調用。用戶可以通過繼承 TableFunction 類或實現 TableFunction 介面的方式來實現自定義的表函數。

3、聚合函數(Aggregate Function)

聚合函數接受多行輸入,返回一行輸出。在 Flink SQL 中,聚合函數可以使用 GROUP BY 語法進行調用。用戶可以通過繼承 AggregateFunction 類或實現 AggregateFunction 介面的方式來實現自定義的聚合函數。 在使用自定義函數時,需要將對應的 Jar 包提交到 Flink 集群中,併在執行任務時將其加入到 Classpath 中。Flink SQL 還提供了 CREATE FUNCTION 語句來註冊用戶自定義的函數,以便在 SQL 查詢中進行調用。 總的來說,自定義函數是 Flink SQL 中非常重要的一個功能,可以幫助用戶擴展 Flink SQL 的功能,提高數據處理的靈活性和效率。

上面的圖片展示了一個聚合的例子。假設你有一個關於飲料的表。表裡面有三個欄位,分別是 id、name、price,表裡有 5 行數據。假設你需要找到所有飲料里最貴的飲料的價格,即執行一個 max() 聚合。你需要遍歷所有 5 行數據,而結果就只有一個數值。
自定義聚合函數是通過擴展 AggregateFunction 來實現的。AggregateFunction 的工作過程如下。首先,它需要一個 accumulator,它是一個數據結構,存儲了聚合的中間結果。通過調用 AggregateFunction 的 createAccumulator() 方法創建一個空的 accumulator。接下來,對於每一行數據,會調用 accumulate() 方法來更新 accumulator。當所有的數據都處理完了之後,通過調用 getValue 方法來計算和返回最終的結果。
下麵幾個方法是每個 AggregateFunction 必須要實現的:

  • createAccumulator()
  • accumulate()
  • getValue()

4、表值聚合函數

自定義表值聚合函數(UDTAGG)可以把一個表(一行或者多行,每行有一列或者多列)聚合成另一張表,結果中可以有多行多列。

上圖展示了一個表值聚合函數的例子。假設你有一個飲料的表,這個表有 3 列,分別是 id、name 和 price,一共有 5 行。假設你需要找到價格最高的兩個飲料,類似於 top2() 表值聚合函數。你需要遍歷所有 5 行數據,結果是有 2 行數據的一個表。
用戶自定義表值聚合函數是通過擴展 TableAggregateFunction 類來實現的。一個 TableAggregateFunction 的工作過程如下。首先,它需要一個 accumulator,這個 accumulator 負責存儲聚合的中間結果。 通過調用 TableAggregateFunction 的 createAccumulator 方法來構造一個空的 accumulator。接下來,對於每一行數據,會調用 accumulate 方法來更新 accumulator。當所有數據都處理完之後,調用 emitValue 方法來計算和返回最終的結果。
下麵幾個 TableAggregateFunction 的方法是必須要實現的:

  • createAccumulator()
  • accumulate()

5、非同步表值函數

非同步表值函數是非同步查詢外部數據系統的特殊函數。

二、需求場景

1、需求描述

基於Flink1.14.4集群,有一批基於某個主鍵生成的collect函數結果數據,需要轉換為字元串傳到下游Kafka。由於collect()函數生成的結果是一個多行的集合MutiSet<varchar(100)>,FlinkSQL中暫未支持concat_ws或者concat函數,因此無法將collect生成的多行結果直接通過現有SQL函數轉換為一行字元串。基於以上原因,需要開發一個自定義函數實現。

2、數據樣例

CREATE TABLE "air_data_source_result" (
  "id" int NOT NULL DEFAULT '0' COMMENT '主鍵',
  "airlineLogo" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "airlineShortCompany" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "arrActCross" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "arrActTime" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "arrAirport" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "arrCode" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "arrOntimeRate" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "arrPlanCross" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "arrPlanTime" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "arrTerminal" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "checkInTable" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "checkInTableWidth" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "depActCross" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "depActTime" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "depAirport" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "depCode" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "depPlanCross" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "depPlanTime" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "depTerminal" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "flightNo" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "flightState" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "localDate" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "mainFlightNo" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "shareFlag" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  "stateColor" varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (1, 'https://cdn1.133.cn/ticket/airline/image_ca_cca.png', '中國國航', '', '11:11\n', '廣州白雲', 'CAN', '89.65%', '', '11:25', 'T1B', 'https://api.133.cn/third/textImg?code=FvOGTb%2Bgbgxpgw9zPNG2Qw==', '30', '', '08:15\n', '北京首都', 'PEK', '', '08:00', 'T3', 'CA1351', '到達', '2023-02-27', '', '0', '#4273FE');
INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (2, 'https://cdn1.133.cn/ticket/airline/image_zh_csz.png', '深圳航空', '', '11:11\n', '廣州白雲', 'CAN', '89.65%', '', '11:25', 'T1B', 'https://api.133.cn/third/textImg?code=FvOGTb%2Bgbgxpgw9zPNG2Qw==', '30', '', '08:15\n', '北京首都', 'PEK', '', '08:00', 'T3', 'ZH1351', '到達', '2023-02-27', 'CA1351', '1', '#4273FE');
INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (3, 'https://cdn1.133.cn/ticket/airline/image_hu_chh.png', '海南航空', '', '11:57\n', '廣州白雲', 'CAN', '75.86%', '', '11:50', 'T1B', 'https://api.133.cn/third/textImg?code=IfLOkkFeJagwbNuqYtoqNg==', '140', '', '08:51\n', '北京首都', 'PEK', '', '08:30', 'T2', 'HU7805', '到達', '2023-02-27', '', '0', '#4273FE');
INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (4, 'https://cdn1.133.cn/ticket/airline/image_ca_cca.png', '中國國航', '', '12:14\n', '廣州白雲', 'CAN', '79.31%', '', '12:20', 'T1B', 'https://api.133.cn/third/textImg?code=FvOGTb%2Bgbgxpgw9zPNG2Qw==', '30', '', '09:19\n', '北京首都', 'PEK', '', '09:00', 'T3', 'CA1321', '到達', '2023-02-27', '', '0', '#4273FE');
INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (5, 'https://cdn1.133.cn/ticket/airline/image_zh_csz.png', '深圳航空', '', '12:14\n', '廣州白雲', 'CAN', '79.31%', '', '12:20', 'T1B', 'https://api.133.cn/third/textImg?code=FvOGTb%2Bgbgxpgw9zPNG2Qw==', '30', '', '09:19\n', '北京首都', 'PEK', '', '09:00', 'T3', 'ZH1321', '到達', '2023-02-27', 'CA1321', '1', '#4273FE');
INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (6, 'https://cdn1.133.cn/ticket/airline/image_hu_chh.png', '海南航空', '', '13:12\n', '廣州白雲', 'CAN', '96.55%', '', '13:40', 'T1B', 'https://api.133.cn/third/textImg?code=IfLOkkFeJagwbNuqYtoqNg==', '140', '', '10:07\n', '北京首都', 'PEK', '', '10:00', 'T2', 'HU7813', '到達', '2023-02-27', '', '0', '#4273FE');
INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (7, 'https://cdn1.133.cn/ticket/airline/image_zh_csz.png', '深圳航空', '', '14:22\n', '廣州白雲', 'CAN', '82.75%', '', '14:25', 'T1B', 'https://api.133.cn/third/textImg?code=FvOGTb%2Bgbgxpgw9zPNG2Qw==', '30', '', '11:22\n', '北京首都', 'PEK', '', '11:00', 'T3', 'ZH1315', '到達', '2023-02-27', 'CA1315', '1', '#4273FE');
INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (8, 'https://cdn1.133.cn/ticket/airline/image_ca_cca.png', '中國國航', '', '14:22\n', '廣州白雲', 'CAN', '82.75%', '', '14:25', 'T1B', 'https://api.133.cn/third/textImg?code=FvOGTb%2Bgbgxpgw9zPNG2Qw==', '30', '', '11:22\n', '北京首都', 'PEK', '', '11:00', 'T3', 'CA1315', '到達', '2023-02-27', '', '0', '#4273FE');
INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (9, 'https://cdn1.133.cn/ticket/airline/image_zh_csz.png', '深圳航空', '', '15:13\n', '廣州白雲', 'CAN', '78.57%', '', '15:25', 'T1B', 'https://api.133.cn/third/textImg?code=FvOGTb%2Bgbgxpgw9zPNG2Qw==', '30', '', '12:19\n', '北京首都', 'PEK', '', '12:00', 'T3', 'ZH1339', '到達', '2023-02-27', 'CA1339', '1', '#4273FE');
INSERT INTO `air_data`.`air_data_source_result` (`id`, `airlineLogo`, `airlineShortCompany`, `arrActCross`, `arrActTime`, `arrAirport`, `arrCode`, `arrOntimeRate`, `arrPlanCross`, `arrPlanTime`, `arrTerminal`, `checkInTable`, `checkInTableWidth`, `depActCross`, `depActTime`, `depAirport`, `depCode`, `depPlanCross`, `depPlanTime`, `depTerminal`, `flightNo`, `flightState`, `localDate`, `mainFlightNo`, `shareFlag`, `stateColor`) VALUES (10, 'https://cdn1.133.cn/ticket/airline/image_ca_cca.png', '中國國航', '', '15:13\n', '廣州白雲', 'CAN', '78.57%', '', '15:25', 'T1B', 'https://api.133.cn/third/textImg?code=FvOGTb%2Bgbgxpgw9zPNG2Qw==', '30', '', '12:19\n', '北京首都', 'PEK', '', '12:00', 'T3', 'CA1339', '到達', '2023-02-27', '', '0', '#4273FE');

3、FlinkSQL表連接

create table air_data_source(
   id  int   COMMENT '主鍵',
   airlineLogo  varchar(100)    ,
   airlineShortCompany  varchar(100)    ,
   arrActCross  varchar(100)    ,
   arrActTime  varchar(100)    ,
   arrAirport  varchar(100)    ,
   arrCode  varchar(100)    ,
   arrOntimeRate  varchar(100)    ,
   arrPlanCross  varchar(100)    ,
   arrPlanTime  varchar(100)    ,
   arrTerminal  varchar(100)    ,
   checkInTable  varchar(100)    ,
   checkInTableWidth  varchar(100)    ,
   depActCross  varchar(100)    ,
   depActTime  varchar(100)    ,
   depAirport  varchar(100)    ,
   depCode  varchar(100)    ,
   depPlanCross  varchar(100)    ,
   depPlanTime  varchar(100)    ,
   depTerminal  varchar(100)    ,
   flightNo  varchar(100)    ,
   flightState  varchar(100)    ,
   localDate  varchar(100)    ,
   mainFlightNo  varchar(100)    ,
   shareFlag  varchar(100)    ,
   stateColor  varchar(100)    
     ) with (
  'connector' = 'jdbc',
  'url' = 'jdbc:mysql://master:3306/air_data?serverTimezone=GMT%2B8',
  'username' = 'root',
  'password' = 'root',
  'table-name' = 'air_data_source'
)
;

4、collect()函數結果

SELECT arrAirport,cast(count(airlineShortCompany) as int) as counts,  collect(airlineShortCompany)  as collects FROM air_data_source group by arrAirport having count(airlineShortCompany)  = 2

三、FlinkSQL UDF 代碼開發

1、pom文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>


  <groupId>com.xxxxx.tech</groupId>
  <artifactId>alarmCollectPlatform</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>


  <properties>
    <flink.version>1.14.4</flink.version>
  </properties>

  <dependencies>
    <!-- flink依賴引入-->
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-java</artifactId>
      <version>${flink.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-table-common</artifactId>
      <version>${flink.version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <encoding>UTF-8</encoding>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

2、java代碼實現

package com.xxxxx.tech.udf;
import org.apache.flink.table.annotation.DataTypeHint;
import org.apache.flink.table.functions.ScalarFunction;
import java.util.Map;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.typeutils.ResultTypeQueryable;

public class MultisetToString extends ScalarFunction implements ResultTypeQueryable<String> {

    public String eval(@DataTypeHint("MULTISET<STRING>") Map<String, Integer> multiset) {
        return multiset.toString();
    }

    @Override
    public TypeInformation<String> getProducedType() {
        return TypeInformation.of(String.class);
    }
}

3、打包

mvn clean install

4、上傳

將打好的jar包上傳到Flink_HOME的lib目錄下,並重啟集群

5、註冊函數

進入bin目錄啟動sql-client,註冊函數

6、使用函數進行轉換

select arrAirport,counts,multiset_to_string(collects) as collects from (
  SELECT arrAirport,cast(count(airlineShortCompany) as int) as counts,  collect(airlineShortCompany)  as collects FROM air_data_source group by arrAirport having count(airlineShortCompany)  = 2
) t


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #ubuntu16.04升級python3.7.1教程 準備 sudo apt-get install --reinstall zlibc zlib1g zlib1g-dev sudo apt-get install libffi-dev libssl-dev libreadline-dev -y ...
  • Linux 文件許可權 文件許可權和文件類型共有10個字元組成,這10個字元可以分成三部分 $$ d+rwx+rwx+rw-\d:表示文件類型\2-4位(第一組rwx):表示文件所有者的對文件的許可權\5-7位(第二組rwx):表示文件所有者所在組的用戶對文件的許可權\8-10位(rw-):表示其他用戶對文 ...
  • 一、項目要求 1、創建role,通過role完成項目(可能需要多個role) 2、部署nginx調度器(node2主機) 3、部署2台lnmp伺服器(node3,node4主機) 4、部署mariadb資料庫(node5主機) 主要用的ansible實現自動化部署,ansible的安裝教程省略,控制 ...
  • 昨天看到一個MySQL資料庫設計原則:強烈建議表的主鍵使用整型自增主鍵。為啥呢? 要弄明白這個問題首先需要瞭解MySQL是如何維護數據的,你需要知道以下幾點: MySQL的InnoDB存儲引擎是在B+樹上維護表數據的 B+樹是一種平衡樹 在這棵樹上,每個節點在電腦中叫做數據頁,預設16k 樹的葉子 ...
  • 一、基本概念 ——後續的內容將會記錄作者在計科學習內容 DB(資料庫):存儲數據的倉庫,數據是有組織進行存儲 DBMS(資料庫管理系統):操縱和管理資料庫的大型軟體 SQL:操縱關係資料庫的編程語言,是一套標準 有Mysql,Oracle,SQLSever,PostgreSQl RDBMS(關係型數 ...
  • 簡述 Db2 是一款具有悠久歷史的關係型資料庫,由 IBM 公司開發和維護,廣泛應用於金融級業務場景。 CloudCanal 近期提供了 Db2 為源端的數據遷移同步 功能,用戶可以便利地將 Db2 中數據實時同步到其他資料庫,實現數據更廣泛、更實時的應用。 功能介紹 目標資料庫和能力 | 目標端數 ...
  • 摘要:華為雲站點數字化平臺CloudMap攜手華為雲圖引擎GES打造雲服務全棧拓撲,網路流量路徑和雲服務動態依賴等空間關係數據,支撐現網運行態風險識別和分鐘級定位定界,構建業界領先的數字化能力。 本文分享自華為雲社區《構建站點數字孿生,支撐確定性運維:華為雲九洲雲圖CloudMap》,作者:HWCl ...
  • 當前,數據對金融機構業務和發展的重要性日益凸顯,釋放數據生產力已經成為金融機構進行全面數字化轉型的核心,這就要求金融機構以數據資產為綱不斷提升自身數據資產管理能力。 本期DTALK我們邀請到雅拓信息解決方案專家 尹曉中,為大家帶來《數據資產管理——金融機構數據價值釋放的必經之路》。 分享大綱劇透: ...
一周排行
    -Advertisement-
    Play Games
  • ## 引言 最近發現自己喜歡用的 Todo 軟體總是差點意思,畢竟每個人的習慣和工作流不太一樣,我就想著自己寫一個小的[Todo 項目]( https://github.com/circler3/TodoTrack ),核心的功能是自動記錄 Todo 執行過程中消耗的時間(尤其面向程式員),按照自己 ...
  • ### 前言 當我們編寫 C# 代碼時,經常需要處理大量的數據集合。在傳統的方式中,我們往往需要先將整個數據集合載入到記憶體中,然後再進行操作。但是如果數據集合非常大,這種方式就會導致記憶體占用過高,甚至可能導致程式崩潰。 C# 中的`yield return`機制可以幫助我們解決這個問題。通過使用`y ...
  • 1. ADO.NET的前世今生 ADO.NET的名稱起源於ADO(ActiveX Data Objects),是一個COM組件庫,用於在以往的Microsoft技術中訪問數據。之所以使用ADO.NET名稱,是因為Microsoft希望表明,這是在NET編程環境中優先使用的數據訪問介面。 ADO.NE ...
  • 1. 為什麼需要單元測試 在我們之前,測試某些功能是否能夠正常運行時,我們都將代碼寫到Main方法中,當我們測試第二個功能時,我們只能選擇將之前的代碼清掉,重新編寫。此時,如果你還想重新測試你之前的功能時,這時你就顯得有些難為情了,因為代碼都被你清掉了。當然你完全可以把代碼寫到一個記事本中進行記錄, ...
  • 1. 透過現象看本質 反射被譽為是 c#中的黑科技 ,在很多領域中都有反射的身影,例如,我們經常使用的ORM框架,ABP框架 等。 反射指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。. 程式集包含模塊,而模塊包含類型,類型又包含成員。. 反射則提供了封裝程式集、模塊和類型的對象。. 您可以使 ...
  • # Rust Web 全棧開發之 Web Service 中的錯誤處理 ## Web Service 中的統一錯誤處理 ### Actix Web Service 自定義錯誤類型 -> 自定義錯誤轉為 HTTP Response - 資料庫 - 資料庫錯誤 - 串列化 - serde 錯誤 - I/ ...
  • 在前面的幾篇文章中,詳細地給大家介紹了Java里的集合。但在介紹集合時,我們涉及到了泛型的概念卻並沒有詳細學習,所以今天我們要花點時間給大家專門講解什麼是泛型、泛型的作用、用法、特點等內容 ...
  • ###BIO:同步阻塞 主線程發起io請求後,需要等待當前io操作完成,才能繼續執行。 ###NIO:同步非阻塞 引入selector、channel、等概念,當主線程發起io請求後,輪詢的查看系統是否準備好執行io操作,沒有準備好則主線程不會阻塞會繼續執行,準備好主線程會阻塞等待io操作完成。 # ...
  • 摘要:在讀多寫少的環境中,有沒有一種比ReadWriteLock更快的鎖呢?有,那就是JDK1.8中新增的StampedLock! 本文分享自華為雲社區《【高併發】高併發場景下一種比讀寫鎖更快的鎖》,作者: 冰 河。 什麼是StampedLock? ReadWriteLock鎖允許多個線程同時讀取共 ...
  • ## 併發與並行😣 ### 併發與並行的概念和區別 並行:同一個時間段內多個任務同時在不同的CPU核心上執行。強調同一時刻多個任務之間的”**同時執行**“。 併發:同一個時間段內多個任務都在進展。強調多個任務間的”**交替執行**“。 ![](https://img2023.cnblogs.co ...