gpt4 book ai didi

java - 从文件流导入 H2 CSV

转载 作者:行者123 更新时间:2023-12-01 22:47:58 27 4
gpt4 key购买 nike

我目前正在使用批量 CSVREAD 将大型 CSV 文件导入 H2:

logger.info("create param table");
templ.execute(paramsTable + " AS SELECT * FROM CSVREAD('" + consoleArgs.paramDataFile + "','FID,MEANING,VALUE,HID');");

但是,为了优化存储,我们将压缩 CSV 文件。因此我需要先解压文件。由于我们不想存储解压后的文件,因此最好将未压缩的字符流直接输入到 H2 中。有什么想法吗?

最佳答案

我可能只是使用PreparedStatement 手动插入数据,而不使用CSV 文件。

或者,您可以使用 the CSV tool你自己(它允许从读者那里阅读)。

您可以创建一个user defined function返回一个表(请参阅文档下面的“将函数用作表”),例如使用那里的 CSV 工具(或您自己的方式生成数据,无需 CSV)。返回结果集的函数示例:

CREATE ALIAS MY_CSV AS $$
import org.h2.tools.*;
import java.sql.*;
@CODE
ResultSet getCsv(Connection conn, String fileName)
throws SQLException {
SimpleResultSet rs = new SimpleResultSet();
rs.addColumn("A", Types.INTEGER, 10, 0);
String url = conn.getMetaData().getURL();
if (url.equals("jdbc:columnlist:connection")) {
return rs;
}
rs.addRow(1);
return rs;
}
$$;

然后使用该函数创建表:

CREATE TABLE TEST 
AS SELECT A FROM MY_CSV('fileName');

H2将调用该方法3次:

  • 在准备阶段,在解析查询时,验证其语法是否正确。在这里,它检索列名称,并检查其中之一是否为“A”。这很快。
  • 在执行阶段,检索列名和数据类型。理论上,不需要此调用,因为自第一次调用以来没有任何变化。但是,请注意这再次只是检索列名称(URL 再次是jdbc:columnlist:connection)。这很快。
  • 在执行阶段,检索实际数据。在本例中,URL 为 jdbc:default:connection。这是缓慢的部分。

关于java - 从文件流导入 H2 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25065241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com