Tispark使用thriftserver插入数据

tispark不支持insert语句,只能通过jdbc进行数据写入。
我们现在希望能在java通过api方式调用tispark(类似通过jdbc方式远程操作mysql)而不是以submit方式提交应用,经过研究选择thriftserver,如果使用thriftserver怎么对数据进行insert?
是否支持该操作?是否有示例供参考?

2 个赞

可以用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 个赞

好的,期待

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。