tispark不支持insert语句,只能通过jdbc进行数据写入。
我们现在希望能在java通过api方式调用tispark(类似通过jdbc方式远程操作mysql)而不是以submit方式提交应用,经过研究选择thriftserver,如果使用thriftserver怎么对数据进行insert?
是否支持该操作?是否有示例供参考?
可以用thriftserver的方式进行insert。 使用方式和sparksql一样。
谢谢!
不过我用spark sql执行insert报错
spark-shell: scala> spark.sql(“insert into insert_test values(2,‘b’)”) 2019-08-07 09:37:08 WARN ObjectStore:568 - Failed to get database hydee, returning NoSuchObjectException org.apache.spark.sql.AnalysisException: TiDBRelation(com.pingcap.tikv.TiSession@2a68932b,TiTableReference(hydee,insert_test,0),com.pingcap.tispark.MetaManager@b7526a9,null) does not allow insertion.;; 'InsertIntoTable Relation[id#2L,name#3] TiDBRelation(com.pingcap.tikv.TiSession@2a68932b,TiTableReference(hydee,insert_test,0),com.pingcap.tispark.MetaManager@b7526a9,null), false, false ± LocalRelation [col1#0, col2#1]
spark-sql: spark-sql> insert into insert_test values (1,‘a’); 2019-08-07 09:42:28 INFO HiveMetaStore:746 - 0: get_database: hydee 2019-08-07 09:42:28 INFO audit:371 - ugi=root ip=unknown-ip-addr cmd=get_database: hydee 2019-08-07 09:42:28 WARN ObjectStore:568 - Failed to get database hydee, returning NoSuchObjectException Error in query: TiDBRelation(com.pingcap.tikv.TiSession@2e0de20d,TiTableReference(hydee,insert_test,0),com.pingcap.tispark.MetaManager@121f97fb,null) does not allow insertion.;; 'InsertIntoTable Relation[id#198L,name#199] TiDBRelation(com.pingcap.tikv.TiSession@2e0de20d,TiTableReference(hydee,insert_test,0),com.pingcap.tispark.MetaManager@121f97fb,null), false, false ± LocalRelation [col1#196, col2#197]
java测试insert也是不行,不支持insert操作:
java thriftserver测试部分代码:
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection connection = DriverManager.getConnection("jdbc:hive2://192.168.10.111:10000");
Statement statement = connection.createStatement();
String sql = "select * from hydee.insert_test";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println(String.format("id: %s, name: %s", id, name));
}
statement.execute("insert into hydee.insert_test values (1,'1')");
} catch (ClassNotFoundException e) {
运行异常结果(可以正常查询数据,不能插入数据):
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
id: 0, name: 0
java.sql.SQLException: org.apache.spark.sql.AnalysisException:
TiDBRelation(com.pingcap.tikv.TiSession@3b6b646a,TiTableReference(hydee,insert_test,161),com.pingcap.tispark.MetaManager@7a321d99,null) does not allow insertion.;;'InsertIntoTable Relation[id#17L,name#18]
TiDBRelation(com.pingcap.tikv.TiSession@3b6b646a,TiTableReference(hydee,insert_test,161),com.pingcap.tispark.MetaManager@7a321d99,null), false, false +- LocalRelation [col1#15, col2#16]
at org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:348)
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:251)
at com.hydee.App.main(App.java:25)
您好, driver 应当使用 mysql jdbc dirver。
mysql的driver是使用tidbserver引擎,hive2时使用tispark引擎。
tispark引擎在ap方面相对优于tidbderver,我们基于tidb做分析比较复杂,希望使用tispark
目前这个版本应该是不支持tispark回写的,需要等到回写的版本ga,而且跟官方了解到如果数据量不大速度相比mysql jdbc提升不是很大
好的,谢谢,我们数据量挺大的,而且包含一些复杂分析。那我们还是用官网提供的dataset的save吧,目前好像只有这个方式
Batch Insert在测试中了,部分功能会这两个月内开放,完整的比如锁表保护需要配合年底4.0版本的 TiDB。
好的,期待
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。