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

Calcite使用SQL實(shí)現(xiàn)查詢csv/json文件內(nèi)容

 更新時(shí)間:2025年01月22日 09:28:40   作者:張鐵牛  
calcite可以支持文件系統(tǒng)的數(shù)據(jù)源適配, 其實(shí)官方已經(jīng)提供了相應(yīng)的能力, 其支持csv和json的查詢適配,下面我們就來(lái)看看Calcite如何使用SQL實(shí)現(xiàn)查詢csv/json文件內(nèi)容吧

1. 簡(jiǎn)介

我們?cè)谇懊娴奈恼绿岬搅薱alcite可以支持文件系統(tǒng)的數(shù)據(jù)源適配, 其實(shí)官方已經(jīng)提供了相應(yīng)的能力, 其支持csv和json的查詢適配, 廢話不多說(shuō), 直接展示.

2. Maven

<!-- calcite文件系統(tǒng)支持 -->
<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. 數(shù)據(jù)文件準(zhǔn)備

3.1 csv

user_info.csv

首行將來(lái)被解析成表的字段, 冒號(hào)后面是字段類(lèi)型, 如果未指定類(lèi)型 默認(rèn)使用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": "學(xué)生",
    "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大小寫(xiě)
        info.setProperty("caseSensitive", "false");
        // 創(chuàng)建Calcite連接
        connection = DriverManager.getConnection("jdbc:calcite:", info);
        CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
        // 構(gòu)建RootSchema,在Calcite中,RootSchema是所有數(shù)據(jù)源schema的parent,多個(gè)不同數(shù)據(jù)源schema可以掛在同一個(gè)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語(yǔ)句執(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 元數(shù)據(jù)
        ResultSetMetaData metaData = resultSet.getMetaData();

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

        // 遍歷 ResultSet 并打印結(jié)果
        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());
        }
    }
}

其實(shí)核心代碼就幾行, 如下:

通過(guò)FileSchemaFactory指定文件目錄和文件內(nèi)容的讀取方式, 默認(rèn)將指定目錄下的csv和json文件讀取成Table, 表名就是file的名稱(chēng)

flavor:

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

calcite也可以做對(duì)應(yīng)表的關(guān)聯(lián)查詢, 測(cè)試中csv關(guān)聯(lián)json文件信息

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

5. 測(cè)試查詢

execute_simple_query方法執(zhí)行如下

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

以上就是Calcite使用SQL實(shí)現(xiàn)查詢csv/json文件內(nèi)容的詳細(xì)內(nèi)容,更多關(guān)于Calcite SQL查詢csv/json的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring Security中successHandler無(wú)效問(wèn)題及解決

    Spring Security中successHandler無(wú)效問(wèn)題及解決

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

    關(guān)于BufferedReader讀取文件指定字符集問(wèn)題

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

    dom4j讀取XML文件詳解

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

    Milvus快速入門(mén)及用Java操作Milvus的全過(guò)程

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

    JDBC 使用說(shuō)明(流程、架構(gòu)、編程)

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

    利用Java實(shí)現(xiàn)圖片馬賽克效果

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

    J2EE項(xiàng)目代碼編寫(xiě)規(guī)范分享

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

    Java數(shù)據(jù)結(jié)構(gòu)順序表用法詳解

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

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

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

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

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

最新評(píng)論

通辽市| 恩施市| 新密市| 于都县| 澜沧| 两当县| 汕尾市| 鹤岗市| 固原市| 淄博市| 陆河县| 金堂县| 长宁县| 交城县| 平乐县| 武强县| 彰化市| 西畴县| 迭部县| 金秀| 鱼台县| 绥芬河市| 日喀则市| 洪湖市| 丹江口市| 茌平县| 乌拉特前旗| 罗江县| 锡林浩特市| 仙居县| 凉城县| 怀来县| 柞水县| 镇平县| 双鸭山市| 海淀区| 万山特区| 漯河市| 广灵县| 克拉玛依市| 建宁县|