对于CsvCruncher项目,我将把一个CSV文件加载到HSQLDB中。
CREATE TEXT TABLE concat_1 ( Op VARCHAR(255), id VARCHAR(255), uuid VARCHAR(255), session_id VARCHAR(255) )
SET TABLE concat_1 SOURCE '.../concat_1.csv;encoding=UTF-8;cache_rows=50000;cache_size=10240000;ignore_first=true;fs=,;qc=\quote'在创建表和加载时,我对列值一无所知。
为了加快选择的速度,我试图通过HSQLDB特性将列(加载后)转换为其他类型:
“如果所有现有值都可以转换为新类型,而不需要字符串截断或有效数字丢失,HyperSQL允许更改类型。”
ALTER TABLE concat_1 ALTER COLUMN id SET DATA TYPE BIGINT但当我尝试的时候,我得到了:
operation is not allowed on text table with data in statement在不将文本表复制到正常(本机)表的情况下,HSQLDB可以这样做吗?
这是你想象的密码:
for (String colName : colNames) {
String sqlTypeUsed = null;
for (String sqlType : new String[]{"TIMESTAMP","UUID","BIGINT","INTEGER","SMALLINT","BOOLEAN"}) {
String sqlCol = String.format("ALTER TABLE %s ALTER COLUMN %s SET DATA TYPE %s",
tableName, colName, sqlTypeUsed = sqlType);
log.info("Column change attempt SQL: " + sqlCol);
try (Statement st = this.conn.createStatement()) {
st.execute(sqlCol);
log.info(String.format("Column %s.%s converted to to %s", tableName, colName, sqlTypeUsed));
} catch (SQLException ex) {
log.info(String.format("Column %s.%s values don't fit to %s.\n %s",
tableName, colName, sqlTypeUsed, ex.getMessage()));
}
}
}发布于 2018-10-04 16:37:36
我想出来了。虽然没有文档化,但是在绑定到CSV文件时,不能更改文本表。
我所做的:
1)我没有尝试使用每种类型的ALTER,而是询问SELECT CAST (<col> AS <type>)。
2)我收集了列所能容纳的所有类型,并选择了最具体和最小的类型。
3)然后我分离了表- SET TABLE <table> SOURCE OFF。
4)然后我做了ALTER COLUMN。
5)重接- SET TABLE <table> SOURCE ON。
这样,表以最合适的类型结束,缓存和索引工作得更好。
但是,对于大型表,将结果表翻转到本机CACHED (基于磁盘)表可能是值得的。
当我清理它的时候密码就来了。
https://stackoverflow.com/questions/52647738
复制相似问题