国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Calcite:開啟異構數據處理新篇

開發 前端
Apache Calcite在整合異構數據源、執行復雜查詢方面展現出了卓越的能力。它為開發人員提供了一種高效、靈活的方式來處理多源數據,大大簡化了跨數據源查詢的實現過程。?

前言

Apache Calcite是一個強大的動態數據管理框架,它專注于提供SQL解析、優化和執行等基礎能力,卻不涉及數據的存儲與處理。這種設計理念賦予了它極高的靈活性,使其能夠輕松集成各類數據源,無論是關系型數據庫、文件系統還是NoSQL數據庫。

其主要功能包括:

  • SQL解析與驗證

支持標準SQL及多種SQL方言的解析,將SQL轉換為抽象語法樹(AST)

提供語義分析功能,驗證表名、列名是否存在,數據類型是否匹配等

  • 查詢優化
  • 基于規則優化(RBO):通過預設規則(如謂詞下推)重寫查詢
  • 基于代價優化(CBO):根據統計信息估算不同執行計劃的代價,選擇最優方案
  • 數據源適配
  • 可連接多種數據源,如關系型數據庫(MySQL、Oracle等)、文件系統(CSV、JSON)、NoSQL數據庫等
  • 支持自定義數據源適配器
  • 跨數據源查詢
  • 能夠連接不同類型的數據源,通過適配器統一抽象不同數據源的操作
  • 將查詢分解為各數據源可處理的子查詢,然后合并結果
  • 執行計劃生成
  • 根據優化結果生成可執行的物理執行計劃
  • 支持JDBC接口,可通過標準JDBC訪問

案例

依賴引入

<dependency>
    <groupId>org.apache.calcite</groupId>
    <artifactId>calcite-core</artifactId>
    <version>1.35.0</version>
</dependency>
<dependency>
    <groupId>org.apache.calcite</groupId>
    <artifactId>calcite-elasticsearch</artifactId>
    <version>1.35.0</version>
</dependency>

model.json模型配置

{
  "version": "1.0",
"defaultSchema": "public",
"schemas": [
    {
      "name": "mysql",
      "type": "custom",
      "factory": "org.example.calcite.CalciteSchemaFactory",
      "operand": {
        "jdbcUrl": "jdbc:mysql://localhost:3306/scp",
        "jdbcUser": "root",
        "jdbcPassword": "root"
      }
    },
    {
      "name": "es",
      "type": "custom",
      "factory": "org.example.calcite.CalciteSchemaFactory",
      "operand": {
        "jdbcUrl": "localhost:9200",
        "jdbcUser": "root",
        "jdbcPassword": "root"
      }
    }
  ]
}

Calcite Schema工廠類

public class CalciteSchemaFactory implements SchemaFactory {

    @Override
    public Schema create(SchemaPlus parentSchema, String name, Map<String, Object> operand) {
        String jdbcUrl = (String) operand.get("jdbcUrl");
        String jdbcUser = (String) operand.get("jdbcUser");
        String jdbcPassword = (String) operand.get("jdbcPassword");
        try {
            if(jdbcUrl.startsWith("jdbc:mysql")){
                DataSource dataSource = createDataSource(jdbcUrl, jdbcUser, jdbcPassword);
                return JdbcSchema.create(parentSchema, name, dataSource, null, null);
            } elseif (jdbcUrl.matches("\\d+\\.\\d+\\.\\d+\\.\\d+:\\d+")){
                HttpHost[] httpHosts = Arrays.stream(jdbcUrl.split(",")).map(HttpHost::create).toArray(HttpHost[]::new);
                RestClient restClient = RestClient.builder(httpHosts).build();
                ElasticsearchSchema esSchema = new ElasticsearchSchema(restClient,new ObjectMapper(),null);
                parentSchema.add(name,esSchema);
                return esSchema;
            } else {
                throw new IllegalArgumentException("Unsupported data source type");
            }

        } catch (Exception e) {
            throw new RuntimeException("Failed to create Calcite schema", e);
        }
    }

    private DataSource createDataSource(String url, String user, String password) {
        DataSource dataSource = DataSourceBuilder.create()
                .driverClassName("com.mysql.cj.jdbc.Driver")
                .url(url)
                .username(user)
                .password(password).build();
        return dataSource;
    }
}

Calcite服務類

@Service
public class CalciteQueryService {

    public List<String> executeQuery(String sql) throws SQLException {
        Properties info = new Properties();
        info.setProperty("lex", "JAVA");
        info.setProperty("model", "D:\\gitee\\self-learn\\01_springboot\\test-demo\\src\\main\\resources\\model.json");

        List<String> results = new ArrayList<>();

        try (Connection connection = DriverManager.getConnection("jdbc:calcite:", info);
             Statement statement = connection.createStatement();
             ResultSet resultSet = statement.executeQuery(sql)) {

            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();

            while (resultSet.next()) {
                StringBuilder row = new StringBuilder();
                for (int i = 1; i <= columnCount; i++) {
                    if (i > 1) row.append(", ");
                    row.append(metaData.getColumnName(i)).append(": ").append(resultSet.getString(i));
                }
                results.add(row.toString());
            }
        }
        return results;
    }
}

控制器類

@RestController
@RequiredArgsConstructor(onConstructor_ = {@Lazy, @Autowired})
public class DemoController {

    private final CalciteQueryService calciteQueryService;

    @GetMapping("/query")
    public List<String> query(@RequestParam String sql) throws SQLException {
        return calciteQueryService.executeQuery(sql);
    }

    @GetMapping("/queryPage")
    public ModelAndView queryPage(@RequestParam String sql) throws SQLException {
        List<String> results = calciteQueryService.executeQuery(sql);
        ModelAndView mav = new ModelAndView("queryResult");
        mav.addObject("results", results);
        return mav;
    }
}

頁面

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>>Calcite 查詢結果</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
        }

        h1 {
            background-color: #007BFF;
            color: white;
            padding: 20px;
            text-align: center;
            margin: 0;
        }

        ul {
            list-style-type: none;
            padding: 0;
            margin: 20px;
            background-color: white;
            border-radius: 5px;
            box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
        }

        li {
            padding: 10px 20px;
            border-bottom: 1px solid #e0e0e0;
        }

        li:last-child {
            border-bottom: none;
        }
    </style>
</head>
<body>
<h1>Calcite 查詢結果</h1>
<ul>
    <li th:each="result : ${results}" th:text="${result}"></li>
</ul>
</body>
</html>

測試

http://localhost:10001/queryPage?sql=SELECT%20*%20FROM%20mysql.user_table

圖片圖片

http://localhost:10001/queryPage?sql=SELECT%20*%20FROM%20es.authlogfb%20limit%205

圖片圖片

這里發現查ES,字段格式有點亂,下面教大家如何格式化,格式化存在特殊字符,需要轉義

  1. 打開瀏覽器開發者工具(通常按F12 或者Ctrl + Shift + I),切換到控制臺(Console)選項卡
  2. 執行encodeURIComponent("SELECT CAST(_MAP['rtime'] AS varchar(20)) AS rtime, CAST(_MAP['user_name'] AS varchar(20)) AS user_name, CAST(_MAP['vpdndomain'] AS varchar(20)) AS vpdndomain, CAST(_MAP['apnname'] AS varchar(20)) AS apnname, CAST(_MAP['imsi'] AS varchar(20)) AS imsi, CAST(_MAP['mdn'] AS varchar(20)) AS mdn, CAST(_MAP['called_id'] AS varchar(20)) AS called_id, CAST(_MAP['resulCode'] AS varchar(20)) AS resulCode, CAST(_MAP['sourceType'] AS varchar(20)) AS sourceType FROM es.authlogfb LIMIT 3")

圖片圖片

再次執行:

圖片圖片

Apache Calcite在整合異構數據源、執行復雜查詢方面展現出了卓越的能力。它為開發人員提供了一種高效、靈活的方式來處理多源數據,大大簡化了跨數據源查詢的實現過程。

責任編輯:武曉燕 來源: 一安未來
相關推薦

2009-11-17 10:07:18

IBMPureScalePower

2024-01-31 23:22:35

vaexPython

2020-11-02 15:56:04

大數據數據庫技術

2018-12-07 14:50:35

大數據數據采集數據庫

2025-06-16 07:07:03

Java數據Jackson

2024-12-06 12:19:43

自然語言NLP人工智能

2016-03-07 20:21:33

華為

2017-07-21 14:22:17

大數據大數據平臺數據處理

2023-07-31 08:21:22

語法校對器Pick

2015-12-10 21:31:19

七牛數據處理架構變遷

2021-07-20 15:37:37

數據開發大數據Spark

2013-12-16 17:17:01

OpenMp數據處理

2023-11-29 13:56:00

數據技巧

2016-12-13 11:48:05

數據處理不平衡數據

2010-08-24 10:07:48

IMOS Inside安防監控H3C

2022-11-17 11:52:35

pandasPySpark大數據

2025-01-07 13:58:08

SQL數據處理函數數據庫

2015-09-01 13:52:12

七牛數據處理DORA

2020-07-22 08:13:22

大數據

2012-06-26 10:03:06

海量數據處理
點贊
收藏

51CTO技術棧公眾號

αv一区二区三区| 久久综合九色综合97婷婷女人 | 国模精品一区二区三区| 亚洲美女自拍视频| 日韩欧美亚洲v片| aaa国产精品视频| 欧美中文字幕亚洲一区二区va在线| 亚洲一区二区在线观| 都市激情亚洲| 中文字幕欧美在线| 黑人与亚洲人色ⅹvideos| 久久久一区二区三区| 麻豆传媒一区二区| 一区二区三区偷拍| 97在线免费| 国产精品久久三区| 成人av网站观看| 日韩大尺度在线观看| 中文字幕精品在线视频| 亚洲按摩av| 欧美视频一二三区| 免费黄色片在线观看| 手机成人av在线| 国产99亚洲| 97视频网站入口| 日韩精品一区国产| 日韩视频一区在线| 欧美黑人一区| 久久精品国产久精国产思思| 国产日产一区二区三区| 欧美老肥妇做.爰bbww| 成人18在线| 欧美最新大片在线看| 你懂的在线观看视频网站| 精品国产一区二区三区av片| 色综合久综合久久综合久鬼88| 日韩国产一二三区| 日韩中文有码在线视频| av高清不卡| 日韩视频免费在线观看| 欧洲精品一区二区三区| 色妞久久福利网| 福利在线一区| 国产在线视频一区| 老司机午夜精品视频| 在线视频不卡一区二区| 久久久精品综合| 日本护士...精品国| 欧美日韩亚洲另类| 亚洲第一会所| 91久久久久久国产精品| 国产一区二区三区久久悠悠色av| 天天av综合网| 亚洲国产精品一区二区久久恐怖片| 2018中文字幕一区二区三区| 一个色的综合| 精品一区二区日韩| 欧美绝品在线观看成人午夜影视| 中文字幕伦理免费在线视频 | 无码国模国产在线观看| 亚洲天堂日韩电影| av网站免费在线观看| 99电影网电视剧在线观看| 国产精品欧美久久久| 亚洲高清久久久| 91欧美视频在线| 国产亚洲欧美aaaa| 国产精品69毛片高清亚洲| 精品亚洲美女网站| 欧美亚洲另类色图| 三级精品视频久久久久| 暴力调教一区二区三区| 日韩电影精品| 日韩 欧美 高清| 成人亲热视频网站| 欧美一级专区免费大片| 国产成a人亚洲精品| 国产精品白丝av嫩草影院| 欧美成人一区二区在线观看| 蜜臀久久99精品久久久画质超高清| 亚洲精品久久久久久久久久久久久| 亚洲尤物影院| 日韩欧美少妇| 国产在线色视频| 色综合久久久久无码专区| 色综合久久久久久中文网| 亚洲午夜久久久久久久久久久| 欧美 亚欧 日韩视频在线 | 成人嫩草影院| 草草影院在线观看| 在线观看污视频| 国产91在线播放精品91| 韩国成人免费视频| 欧美亚洲第一区| 亚洲毛片在线观看.| 亚洲一区在线观看视频| 欧美日韩国产高清| 国产一级片在线| 日本一区二区三区视频在线观看 | 麻豆一区一区三区四区| 国产美女玉足交| 91精品国产综合久久久久久蜜臀 | 成年人在线看| 亚洲精品中字| 九九热这里只有精品免费看| 少妇一区二区三区| 亚洲成人影院少妇| 亚洲精品国产精品久久| 日韩最新中文字幕电影免费看| 亚洲视频网在线直播| 日韩一区自拍| 97视频资源在线观看| 日韩情涩欧美日韩视频| 成人av资源在线| 奇米777国产一区国产二区| 91caoporm在线视频| 成年人视频观看| 成人av影视在线| 久久久免费在线观看| 欧美男生操女生| 亚洲色图欧洲色图| 国产一区二区三区观看| 天天操综合网| 精品欠久久久中文字幕加勒比| 欧美13一16娇小xxxx| 4虎在线播放1区| 日本xxxxx18| 国产在线一区二区三区播放| 欧美成人黄色小视频| 亚洲成人a**站| 欧美日韩一区二区三区四区五区 | www.久久久精品| 欧美精品久久| 欧美午夜片在线看| 草莓视频成人appios| 日韩aⅴ视频一区二区三区| 一个色综合av| 欧美风情在线视频| 人妻无码一区二区三区四区| 亚洲欧美在线一区二区| 风间由美一区二区av101 | 欧美三级午夜理伦三级小说| 成人av影院在线| 四虎影视成人| 黄色片视频在线观看| 在线观看黄色小视频| 992tv在线观看在线播放| 浮妇高潮喷白浆视频| 一区二区精品视频| 色综合666| 男女激情免费视频| 日韩欧美视频免费在线观看| 手机成人在线| 91免费黄视频| 亚洲欧美久久久久| 黑巨人与欧美精品一区| 成视频免费在线看| 亚洲福利二区| 欧美aaa免费| 日韩三级影视| 国产精品香蕉| 欧美日本三区| 欧美人体视频| 999精品网| 中文字幕在线播放| 国产精品视频999| 4438全国亚洲精品在线观看视频| 久久亚洲一区二区三区四区五区高| 中文字幕成人在线| 国产精品日韩欧美综合| 91文字幕巨乱亚洲香蕉| 亚洲精品国产suv一区88| 国产区二区三区| 国产丝袜在线| 精品自拍视频| 婷婷久久国产对白刺激五月99| 亚洲精品欧美| 国产欧美视频在线观看| 69堂精品视频| 欧美亚洲第一页| 中文一区一区三区免费| 欧美婷婷久久五月精品三区| 69堂免费精品视频在线播放| 精品九九在线| 91在线视频网址| 欧美日韩极品在线观看一区| 久久久电影免费观看完整版| 国内精品一区二区| 国产v亚洲v天堂无码久久久| 视频在线这里都是精品| 日韩精品四区| 18成人在线观看| 欧美成人免费视频| 无码人妻精品一区二区蜜桃百度| 日本三级视频在线播放| 大色综合视频网站在线播放| 欧美—级在线免费片| 日韩在线中文视频| a级黄色小视频| 亚洲精品动漫|