使用TiSpark写入数据后,无法通过主键查询

TiDB版本:7.1.2
TiSpark版本:[tispark-assembly-3.3_2.12-3.2.2.jar]
Spark版本:3.3.1

现象:
1、通过TiSpark运行insert into select得到表dw_company_extend,此时表中已存在数据
2、在tidb执行select id from dw_company_extend limit 1得到结果:95100000101705142Q
3、在tidb执行select id from dw_company_extend where id = ‘95100000101705142Q’,没有结果

建表DDL:
CREATE TABLE dw_company_extend (
id varchar(20) NOT NULL DEFAULT ‘’ COMMENT ‘公司ID’,
staff_size varchar(255) DEFAULT ‘’ COMMENT ‘人员规模’,
PRIMARY KEY (id) /*T![clustered_index] NONCLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=‘扩展信息dw表’;

按理说不应该,直接从tidb查询看看结果呢

可能是由于TiDB和TiSpark在处理字符串时的差异导致的。TiDB字符串默认使用utf8编码,而TiSpark默认使用latin1编码,你调整编码试试

1 个赞

这正常操作不应该会有这种情况,把这些语句的执行计划都贴一下

explain analyze table之后在查询试试?或者用mysql客户端连接查询试试

检查一下前面 或者后面有空格的现象

就是从tidb查询的结果

explain analyze 执行计划:

id estRows actRows task access object execution info operator info memory disk
Point_Get_1 1.00 0 root dw_company_extend, index:PRIMARY(id) time:4.33ms, loops:1, RU:0.270654, Get:{num_rpc:1, total_time:4.29ms}, total_process_time: 62µs, total_wait_time: 3.05ms, tikv_wall_time: 3.14ms, scan_detail: {total_keys: 1, get_snapshot_time: 3.02ms, rocksdb: {block: {cache_hit_count: 8}}} N/A N/A

这个肯定是没有的

8200 - Unsupported modify charset from utf8mb4 to latin1

我感觉似乎是主键索引没有被创建,我插入相同的主键ID,不会报错

org.apache.spark.SparkException: Job aborted due to stage failure: Task 4 in stage 24.0 failed 4 times, most recent failure: Lost task 4.3 in stage 24.0 (TID 473) (hadoop-0002 executor 2): com.pingcap.tikv.exception.CodecException: Unsupported collation: latin1_bin

TiSpark真的支持这个编码吗?

select id from where id
这种查询方法是可以查询到数据的吗?后面是不是得加 and id=id?

这种方法可以查到数据,加上and id= ?后就查不到了

检查一下数据库的排序规则:collation_database

image

我本地测试结果 ,没有发现异常
mysql> CREATE TABLE dw_company_extend (
→ id varchar(20) NOT NULL DEFAULT ‘’ COMMENT ‘公司ID’,
→ staff_size varchar(255) DEFAULT ‘’ COMMENT ‘人员规’,
→ PRIMARY KEY (id) /*T![clustered_index] NONCLUSTERED */
→ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=‘扩展信息dw表’;
Query OK, 0 rows affected (0.19 sec)
mysql> insert into dw_company_extend values (‘95100000101705142Q’,‘非常大’);
Query OK, 1 row affected (0.01 sec)

mysql> select * from dw_company_extend where id = ‘95100000101705142Q’;
±-------------------±-----------+
| id | staff_size |
±-------------------±-----------+
| 95100000101705142Q | 非常大 |
±-------------------±-----------+
1 row in set (0.00 sec)

mysql> select id from dw_company_extend limit 1;
±-------------------+
| id |
±-------------------+
| 95100000101705142Q |
±-------------------+
1 row in set (0.01 sec)

你复现的方式不对,我正常使用mysql端的insert select也是没问题的,问题在于,使用TiSpark插入大量数据的时候,执行insert into select,数据量在5000万-1亿,执行成功后,查询出现异常现象,这个问题不好复现,因为我在数据量小的时候(10条数据),也是正常的

admin check table dw_company_extend
检查了索引似乎没问题,突然发现insert into select的两张表编码不一致,一张是utf8,一张是utf8mb4,我调整一致后再跑一次数据试试

重新跑完正常了,看来真的是两个表字符集不一致导致的问题,不知道算不算是bug