Tispark 如何快速修改tidb 大表数据

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】

【概述】 场景 + 问题概述
在一个过亿的数据表中, 需要根据当前表的数据,经过一定的业务操作修改数据,再把数据回填到当前表中,简单的说就是根据当前数据修改数据。
目前计划是通过tispark,但因为spark 目前好像还不支持update操作,操作方式是append;
故在spark使用了insert int xxx() ON DUPLICATE KEY UPDATE 的方式;不过目前测试下来,性能不佳,请问各位大佬,有什么良策呢?

【背景】 做过哪些操作

【现象】 业务和数据库现象

【问题】 当前遇到的问题

【业务影响】

【 TiDB 版本】
tidb-v5.1.1
【附件】 相关日志及监控(https://metricstool.pingcap.com/)


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

1 个赞

参考下这个


https://github.com/pingcap/tispark/blob/master/docs/datasource_api_userguide.md

3 个赞

请问还有更详细些得操作文档吗?

可以参考github 上的源码

https://github.com/pingcap/tispark-test/blob/master/tispark-examples/src/main/scala/com/pingcap/tispark/examples/TiDataSourceExampleWithExtensions.scala

1 个赞

请问你是通过哪种方式写回tidb的?是jdbc方式还是直写tikv的操作?直写tikv的方式类似


从你的描述来看,应该是通过jdbc的方式,建议尝试一下直写tikv的方式。
直写tikv参考:
// tispark will send lock table command to TiDB via JDBC
val tidbOptions: Map[String, String] = Map(
“tidb.addr” → “127.0.0.1”,
“tidb.password” → “”,
“tidb.port” → “4000”,
“tidb.user” → “root”,
“spark.tispark.pd.addresses” → “127.0.0.1:2379”
)

val customer = spark.sql(“select * from customer limit 100000”)

customer.write
.format(“tidb”)
.option(“database”, “tpch_test”)
.option(“table”, “cust_test_select”)
.options(tidbOptions)
.mode(“append”)
.save()
这种方式,不支持几个场景,针对2.4.1版本,2.5.0还在测试中:
1.聚簇表不支持
2.分区表不支持
3.auto random 列不支持
4.generated column不支持

1 个赞

tispark 官网上,通过 sql 来 insert 的方式是可以直连 tikv 的,但需要一些额外步骤https://github.com/pingcap/tispark/blob/master/docs/datasource_api_userguide.md#use-data-source-api-in-sparksql
但还是更推荐使用 write api ,指定 replace true 即可。https://github.com/pingcap/tispark/blob/master/docs/datasource_api_userguide.md#tidb-data-source-api-user-guide

1.想问一下您 insert 的方式是官网这种方式吗?看起来更像是使用了 spark jdbc connector,这就没有办法 bypass tidb
2.性能不佳:能否分享一些您想达到的性能与目前测试下来的性能?如果后面使用了 tispark 写入也可以分享一下基于 tispark 的性能

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