最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Calcite使用SQL實現查詢csv/json文件內容

 更新時間:2025年01月22日 09:28:40   作者:張鐵牛  
calcite可以支持文件系統的數據源適配, 其實官方已經提供了相應的能力, 其支持csv和json的查詢適配,下面我們就來看看Calcite如何使用SQL實現查詢csv/json文件內容吧

1. 簡介

我們在前面的文章提到了calcite可以支持文件系統的數據源適配, 其實官方已經提供了相應的能力, 其支持csv和json的查詢適配, 廢話不多說, 直接展示.

2. Maven

<!-- calcite文件系統支持 -->
<dependency>
    <groupId>org.apache.calcite</groupId>
    <artifactId>calcite-file</artifactId>
    <version>1.37.0</version>
</dependency>
<dependency>
    <groupId>org.apache.calcite</groupId>
    <artifactId>calcite-core</artifactId>
    <version>1.37.0</version>
</dependency>

3. 數據文件準備

3.1 csv

user_info.csv

首行將來被解析成表的字段, 冒號后面是字段類型, 如果未指定類型 默認使用varchar

ID:long,姓名:string,GENDER:string,BIRTHDAY:date
100,"張三",,"2001-01-01"
110,"李四","M","2001-01-01"
120,"王五","M","2002-05-03"
130,"趙六","F","2005-09-07"
140,"張鐵牛","M","2007-01-01"

3.2 json

role_info.json

[
  {
    "id": 123,
    "name": "管理員",
    "key": "manager"
  },
  {
    "id": 234,
    "name": "老師",
    "key": "teacher"
  },
  {
    "id": 345,
    "name": "學生",
    "key": "student"
  }
]

然后將文件放到resources/file目錄下

4. 核心代碼

package com.ldx.calcite;

import com.google.common.collect.ImmutableMap;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.calcite.adapter.file.FileSchemaFactory;
import org.apache.calcite.jdbc.CalciteConnection;
import org.apache.calcite.schema.Schema;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.util.Sources;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testng.collections.Maps;

import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
import java.util.Properties;

@Slf4j
public class CalciteFileTest {
    private static Connection connection;

    private static SchemaPlus rootSchema;

    private static Statement statement;

    @BeforeAll
    @SneakyThrows
    public static void beforeAll() {
        Properties info = new Properties();
        // 不區(qū)分sql大小寫
        info.setProperty("caseSensitive", "false");
        // 創(chuàng)建Calcite連接
        connection = DriverManager.getConnection("jdbc:calcite:", info);
        CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
        // 構建RootSchema,在Calcite中,RootSchema是所有數據源schema的parent,多個不同數據源schema可以掛在同一個RootSchema下
        rootSchema = calciteConnection.getRootSchema();
        final Schema schema = FileSchemaFactory.INSTANCE.create(rootSchema, "x",
                ImmutableMap.of("directory", resourcePath("file"), "flavor", "scannable"));
        rootSchema.add("test", schema);
        // 創(chuàng)建SQL語句執(zhí)行查詢
        statement = calciteConnection.createStatement();
    }

    @Test
    @SneakyThrows
    public void execute_simple_query() {
        ResultSet resultSet = statement.executeQuery("SELECT * FROM test.user_info");
        printResultSet(resultSet);
    }
  
    @Test
    @SneakyThrows
    public void test_execute_join_query() {
        ResultSet resultSet = statement.executeQuery("SELECT * FROM test.user_info ui inner join test.role_info ri on ui.role_id = ri.id");
        printResultSet(resultSet);
    }

    @AfterAll
    @SneakyThrows
    public static void closeResource() {
        statement.close();
        connection.close();
    }

    private static String resourcePath(String path) {
        final URL url = CalciteFileTest.class.getResource("/" + path);
        return Sources.of(url).file().getAbsolutePath();
    }

    public static void printResultSet(ResultSet resultSet) throws SQLException {
        // 獲取 ResultSet 元數據
        ResultSetMetaData metaData = resultSet.getMetaData();

        // 獲取列數
        int columnCount = metaData.getColumnCount();
        log.info("Number of columns: {}",columnCount);

        // 遍歷 ResultSet 并打印結果
        while (resultSet.next()) {
            final Map<String, String> item = Maps.newHashMap();
            // 遍歷每一列并打印
            for (int i = 1; i <= columnCount; i++) {
                String columnName = metaData.getColumnName(i);
                String columnValue = resultSet.getString(i);
                item.put(columnName, columnValue);
            }

            log.info(item.toString());
        }
    }
}

其實核心代碼就幾行, 如下:

通過FileSchemaFactory指定文件目錄和文件內容的讀取方式, 默認將指定目錄下的csv和json文件讀取成Table, 表名就是file的名稱

flavor:

  • SCANNABLE: 數據掃描。會更側重于快速地讀取和遍歷數據。這種方式適用于需要對大量數據進行全表掃描或者范圍掃描的情況,例如統計匯總操作
  • FILTERABLE: 數據過濾。會更側重于數據的條件篩選,比如在 SQL 查詢中的WHERE子句。
  • TRANSLATABLE: 數據轉換。會更側重于數據轉換,以滿足特定的查詢需求或者數據處理要求。這種轉換可能包括數據類型的轉換(如將字符串類型的數字轉換為實際的數值類型)、格式轉換(如日期格式的調整)等。
// 這里的第二個參數“x”沒什么意義, 源碼中沒用到, 可以隨便填
final Schema schema = FileSchemaFactory.INSTANCE.create(rootSchema, "x",
               ImmutableMap.of("directory", resourcePath("file"), "flavor", "scannable"));
// 使用目錄名稱為schema名稱, 這里的test就是schema名稱
rootSchema.add("test", schema);

calcite也可以做對應表的關聯查詢, 測試中csv關聯json文件信息

"SELECT * FROM test.user_info ui inner join test.role_info ri on ui.role_id = ri.id"

5. 測試查詢

execute_simple_query方法執(zhí)行如下

test_execute_join_query方法執(zhí)行如下:

以上就是Calcite使用SQL實現查詢csv/json文件內容的詳細內容,更多關于Calcite SQL查詢csv/json的資料請關注腳本之家其它相關文章!

相關文章

  • Spring Security中successHandler無效問題及解決

    Spring Security中successHandler無效問題及解決

    這篇文章主要介紹了Spring Security中successHandler無效問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 關于BufferedReader讀取文件指定字符集問題

    關于BufferedReader讀取文件指定字符集問題

    這篇文章主要介紹了關于BufferedReader讀取文件指定字符集問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • dom4j讀取XML文件詳解

    dom4j讀取XML文件詳解

    這篇文章主要為大家詳細介紹了dom4j讀取XML文件的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Milvus快速入門及用Java操作Milvus的全過程

    Milvus快速入門及用Java操作Milvus的全過程

    Milvus是面向向量的數據庫,通過相似性搜索處理非結構化數據特征,本文給大家介紹Milvus快速入門以及用Java操作Milvus的方法,感興趣的朋友一起看看吧
    2025-09-09
  • JDBC 使用說明(流程、架構、編程)

    JDBC 使用說明(流程、架構、編程)

    這篇文章主要介紹了JDBC 使用說明,需要的朋友可以參考下
    2015-08-08
  • 利用Java實現圖片馬賽克效果

    利用Java實現圖片馬賽克效果

    馬賽克效果是一種常見的圖像處理技術,通過將圖像劃分為多個小塊并對每個小塊進行平均色處理,模擬馬賽克的效果,在本項目中,我們將使用Java的Swing庫和圖像處理技術來實現圖片的馬賽克特效,需要的朋友可以參考下
    2025-02-02
  • J2EE項目代碼編寫規(guī)范分享

    J2EE項目代碼編寫規(guī)范分享

    這篇文章主要介紹了J2EE項目代碼編寫規(guī)范分享,需要的朋友可以參考下
    2014-10-10
  • Java數據結構順序表用法詳解

    Java數據結構順序表用法詳解

    順序表是計算機內存中以數組的形式保存的線性表,線性表的順序存儲是指用一組地址連續(xù)的存儲單元依次存儲線性表中的各個元素、使得線性表中在邏輯結構上相鄰的數據元素存儲在相鄰的物理存儲單元中,即通過數據元素物理存儲的相鄰關系來反映數據元素之間邏輯上的相鄰關系
    2021-10-10
  • Java中的自旋鎖與阻塞鎖詳解

    Java中的自旋鎖與阻塞鎖詳解

    這篇文章主要介紹了Java中的自旋鎖與阻塞鎖詳解,阻塞鎖是指當線程嘗試獲取鎖失敗時,線程進入阻塞狀態(tài),直到接收信號后被喚醒,阻塞或者喚醒一個Java線程需要操作系統切換CPU?狀態(tài)來完成,這種狀態(tài)轉換?需要耗費處理器時間,需要的朋友可以參考下
    2023-10-10
  • Nacos配置中心與本地代碼工程配置文件之間的優(yōu)先級關系詳解

    Nacos配置中心與本地代碼工程配置文件之間的優(yōu)先級關系詳解

    本文介紹了Spring Cloud生態(tài)中配置加載原理,強調Nacos遠程配置優(yōu)先級高于本地`application.yml`但低于命令行和環(huán)境變量,覆蓋了多環(huán)境配置、動態(tài)刷新配置及安全配置外置等應用場景,對比了Nacos配置中心與本地配置文件的優(yōu)缺點,并給出最佳實踐建議
    2026-04-04

最新評論

开封县| 东乌珠穆沁旗| 乐亭县| 独山县| 利辛县| 海兴县| 连城县| 吴忠市| 额尔古纳市| 德昌县| 当阳市| 布拖县| 泰顺县| 福清市| 色达县| 泾源县| 佛学| 辉南县| 雅江县| 阿瓦提县| 三原县| 东光县| 侯马市| 原阳县| 齐河县| 汉阴县| 土默特左旗| 紫阳县| 昔阳县| 潮安县| 临猗县| 霍林郭勒市| 綦江县| 长葛市| 凤阳县| 汪清县| 光泽县| 葵青区| 柞水县| 云浮市| 乐至县|