TiSpark从TiDB读取数据,怎么写入Hive?怎么解决Hive库与TiDB库名冲突的问题?

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.7
  • 【问题描述】:
    我们Hive库和TiDB库有些库名和表名是相同的,同一份数据存了两份,一份在TiDB,一份在Hive。
    我打算从TiDB中读取数据,用TiSpark进行分析,分析完之后,把结果写入到Hive中。
    如果不加enableHiveSupport的话,那么TiSpark读取的是TiDB的库和表,如果加上了enableHiveSupport,就会读取Hive的库和表。

    我的问题是,
    1、读取数据的时候,怎么区分hive的库和表,以及TiDB的库和表?
    2、写出数据的时候,如何写到Hive?如果我加了enableHiveSupport,是可以写入到Hive 但读到的就是Hive的表,不是TiDB的表了。如果我不加enableHiveSupport,就没办法写入到Hive了。
    3、请问用下图这种方式从TiDB读数据的话,TiSpark是直接从TiKV读的数据,还是通过jdbc的方式读的数据?关键是速度如何?如果我加上enableHiveSupport,同时使用这种方式读数据,然后让Spark用正常的方式写Hive的话,应该可以实现从TiDB读数据,TiSpark分析完之后写Hive的。问题的关键在于这种方式TiSpark从TiDB读取数据的速度。

    4、或者如下图,我用enableHiveSupport,同时把hive-site中的meta给注释掉?这样是不是就可以默认从tidb读数据,然后spark.sql( insert into HiveTable )了?
  1. enableHiveSupport 设置为true的话TiDB表和Hive表应该是在不同的database里面,可以通过dbname.tablename来指定具体读哪张表
  2. sqlContext.read.format(“tidb”).xxx 这种用法我们不推荐使用,可能会有问题,推荐用 spark.sql(“select * from tpch_test.orders”)这种用法,这样的话是用tispark直接读tikv的

哦哦,好的。如果我不使用enableHiveSupport的话,那TiSpark里面,用库名.表名,读取的就是TiDB的数据,这一块目前是满足我们的需求的。
1、但是我目前有个问题没解决,就是如果不用enableHiveSupport的话,如何把数据写到Hive里面去?
2、同时,我用enableHiveSupport的时候,执行spark.sql(show databases),显示的都是Hive的库,没有显示TiDB的库,所以我想,是不是enableHiveSupport会把TiDB的某些配置覆盖掉?


3、我目前主要是不知道如何往Hive里面写数据了

enableHiveSupport开了之后预期是能正常读取tidb的表的,你可以直接select count(*) from tidb_dbname.tidb_tablename来试一下会不会报错,另外你用的什么版本?

1赞

我试了下,加上enableHiveSupport,确实是可以读TiDB表的,非常感谢。
tidb我用的是v4.0.7, Spark和tispark-assembly我用的都是2.3.0版本的。

那如果hive里面和tidb里面,有的库重名了怎么处理?我们tidb的很多数据就是hive导入过来的,库名和表名都一样。
现在的问题主要是这个,就是用了enableHiveSupport,同时Hive和TiDB的库名相同,怎么知道TiSpark读的是Hive的数据,还是TiDB的数据?
以及怎么控制spark.sql(insert into 库名.表名)的时候,是往hive还是tidb写入的数据?

针对同名库,可以用这个参数加以区分 spark.tispark.db_prefix,可以参考这里 https://github.com/pingcap/tispark#configuration

写入的时候,可以用 https://github.com/pingcap/tispark/blob/master/docs/datasource_api_userguide.md#use-data-source-api-in-sparksql 这里提到的方式,通过 create table using tidb options 语句建立一个 TiDB 的映射表,然后就可以用例如 insert 语句写入到这张表里。

针对 Hive 及 TiDB 的同名表库等情况,我们有过一个方案是使用 from table use $datasource 这样的语法来进行区分。但目前由于优先级不高暂时搁置,如果有兴趣的话我们可以私下讨论~

1赞