3. 使用sql查询csv/json文件内容,还能关联查询?

news/2025/1/21 17:28:59/文章来源:https://www.cnblogs.com/ludangxin/p/18683656

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@SneakyThrowspublic static void beforeAll() {Properties info = new Properties();// 不区分sql大小写info.setProperty("caseSensitive", "false");// 创建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);// 创建SQL语句执行查询statement = calciteConnection.createStatement();}@Test@SneakyThrowspublic void execute_simple_query() {ResultSet resultSet = statement.executeQuery("SELECT * FROM test.user_info");printResultSet(resultSet);}@Test@SneakyThrowspublic 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@SneakyThrowspublic 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方法执行如下

test_execute_join_query方法执行如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872886.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文搞懂 APP 算法备案

今天来给大家好好科普一下超重要的 APP 算法备案,这可是和我们日常使用 APP 以及 APP 运营都息息相关的知识点哦! 什么是算法备案 简单来讲,算法备案就相当于 APP 运营者要把自家 APP 里使用的算法详情,向有关部门进行申报登记。这就如同给算法这个 “幕后大脑” 办一张正式…

IDEA 在远程 Tomcat 上运行项目(转载补充版)

转载:IDEA 在远程 Tomcat 上运行项目(亲身避坑版) 我在操作的时候,遇到个问题,提示Unable to open debugger port (192.168.252.232:54578): java. net. ConnectException "Connection refused: connect" 原因是,开启JVM调试,需要在2.1小节设置环境变量的时候…

VMware Tools 13.0.0 发布 - 客户机操作系统无缝交互必备组件

VMware Tools 13.0.0 发布 - 客户机操作系统无缝交互必备组件VMware Tools 13.0.0 发布 - 客户机操作系统无缝交互必备组件 VMware 虚拟机必备组件 (驱动和交互式服务) VMware Tools 13.0.0 发布 - 虚拟机必备组件 (驱动和交互式服务) VMware 客户机操作系统无缝交互必备组件 请…

【交通行业】2024中国网络安全产业势能榜优能企业「交通行业」典型案例展示

交通行业的智能化发展使得交通系统的效率得到了大幅提升,但随之而来的安全隐患也不容忽视。从自动驾驶到智慧交通,每一项技术的进步都伴随着数据保护和系统安全的挑战。我们将通过交通行业的典型案例,探索在高速发展的同时,如何确保交通系统的安全和稳定。 PS:典型案例展示…

ITIL认证工具商-ManageEngine Servicedesk Plus

ServiceDesk Plus是Zoho Corporation旗下企业IT管理部门ManageEngine提供的统一服务管理解决方案。凭借其无限的可扩展性、情境化的IT和业务集成以及一键式工作流程自动化功能,IT领导者可以使用ServiceDesk Plus有效执行和控制跨不同业务部门和IT功能的复杂工作流程。 Service…

微信公众号-脚本简单实现,自动新建草稿并发布草稿文章,代码开源

介绍 本来想写一个自动化发布微信公众号的小绿书的脚本。但是微信公众号官网没有小绿书的接口。 想着算了吧,写都写了,那就写一个微信普通文章的脚本吧。 写完了 就想着把脚本分享出来,给大家一起交流下。 水平有限,大佬轻喷。思路 1,获取百度热搜列表 2,给热搜图片加上文…

如何在织梦CMS中修改网站标题?

织梦CMS(DedeCMS)是一款流行的开源内容管理系统。以下是修改织梦网站标题的步骤:登录后台:使用管理员账号登录织梦CMS后台管理系统。 进入模板管理:在后台管理系统中找到“模板管理”或“模板文件管理”选项。 编辑模板文件:找到包含网站标题的模板文件(如index.htm),…

修改公司网站数据库名称时需要注意的问题及解决方案

问题描述 当需要对公司网站的数据库名称进行更改时,有哪些潜在风险和挑战?如何确保这一过程顺利进行? 答案 修改公司网站的数据库名称是一项敏感的操作,因为它涉及到整个系统的底层架构,稍有不慎就可能导致数据丢失或服务中断。以下是需要注意的问题及解决方案:评估影响范…

使用FlashFXP修改网站代码

问题描述 如何使用FlashFXP工具安全地修改网站代码,确保网站正常运行? 答案 FlashFXP是一款常用的FTP客户端,广泛用于网站文件的上传和下载。通过FlashFXP,用户可以方便地修改网站代码。以下是详细的步骤和注意事项:安装FlashFXP:首先,下载并安装FlashFXP软件。确保安装…

如何处理虚拟主机上的系统误报和非法信息检测问题?

要处理虚拟主机上的系统误报和非法信息检测问题,您可以采取以下措施:确认误报文件:检查被误报为病毒的文件是否确实为正常文件。如果是正常文件,建议联系程序提供商重新设计页面,避免使用容易被误判的文件名或格式。 如果文件确实是合法的,可以尝试将其路径添加到白名单中…

服务器端口不通?快速排查与解决方法

用户在配置安全组时遇到问题,尽管已经开放了特定端口(如1238和8283),但仍然无法访问这些端口。例如,用户尝试访问这两个端口时发现ping不通。 解决方案:步骤 描述1 确认服务器上是否有服务正在监听这些端口。如果没有服务监听,则外网无法访问这些端口。2 检查服务器防火…

FTP修改网站内容后无变化的原因分析及解决方案

当通过FTP修改网站内容后无变化时,可能是由多种原因引起的。以下是详细的排查步骤和解决方案:确认FTP登录信息:确保您使用的FTP用户名和密码是正确的,并且连接的是正确的服务器地址。建议使用ftp://127.0.0.1重新登录FTP,确保连接无误。检查文件上传路径:确认上传的文件是…