我如何使用 spring Jdbc 模板或其他批量插入数据到带分区的配置单元 table?
How Can I use spring Jdbc template or others batch insert data to hive table with a partition?
如题,我想通过springNamedParameterJbbcTemplate批量插入数据到hivetable,可以实现如下:
SqlParameterSource[] batchParameterSources = SqlParameterSourceUtils.createBatch(batchValues);
template.batchUpdate("insert into table(a, b, c) values(:a, :b, :c)", batchParameterSources);
但是,上面sql无法分配分区,使用sql
"insert overwrite table partition(date = '2020-04-02') values (:a, :b, :c)"
spring 将抛出 SQLFeatureNotSupportException:方法不受支持。
那么如何使用springjdbc模板批量插入数据到特殊分区的hivetable?
期待您的回答,
非常感谢!
我研究了 Spring 教程,但没有找到有关批量插入到具有特殊分区的配置单元 table 的信息。
所以我用的是原生的hive驱动
您可以如下编码:
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection connection = DriverManager.getConnection("hiveserver", "username", "password");
Statement statement = connection.createStatement();
boolean result = statement.execute("insert overwrite table table_name partition(dt = 'date') values (valueA), (valueB), (valueC)");
if (!result) {
log.info("write data successfully");
}
}
注:
- 如果存储一些数据,statement.execute() 方法将return false。因为存储不会有结果到return.
- 如果你的数据太多,最好分批存储,比如
insert overwrite table_name partition(dt='date') values (valueA), (valueB)...
insert into table_name partition(dt='date') values (valueC), (valueD)...
如题,我想通过springNamedParameterJbbcTemplate批量插入数据到hivetable,可以实现如下:
SqlParameterSource[] batchParameterSources = SqlParameterSourceUtils.createBatch(batchValues);
template.batchUpdate("insert into table(a, b, c) values(:a, :b, :c)", batchParameterSources);
但是,上面sql无法分配分区,使用sql
"insert overwrite table partition(date = '2020-04-02') values (:a, :b, :c)"
spring 将抛出 SQLFeatureNotSupportException:方法不受支持。
那么如何使用springjdbc模板批量插入数据到特殊分区的hivetable?
期待您的回答, 非常感谢!
我研究了 Spring 教程,但没有找到有关批量插入到具有特殊分区的配置单元 table 的信息。
所以我用的是原生的hive驱动
您可以如下编码:
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection connection = DriverManager.getConnection("hiveserver", "username", "password");
Statement statement = connection.createStatement();
boolean result = statement.execute("insert overwrite table table_name partition(dt = 'date') values (valueA), (valueB), (valueC)");
if (!result) {
log.info("write data successfully");
}
}
注:
- 如果存储一些数据,statement.execute() 方法将return false。因为存储不会有结果到return.
- 如果你的数据太多,最好分批存储,比如
insert overwrite table_name partition(dt='date') values (valueA), (valueB)...
insert into table_name partition(dt='date') values (valueC), (valueD)...