table does not exists,select 1 from tablename limit 1

本文探讨了Spark在使用JDBC API保存DataFrame至PostgreSQL时遇到的“表不存在”错误日志现象。通过逐步排查,最终定位到是Spark内部进行表存在性检查所导致,并非业务代码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在postgreSQL的log里看到了大量的:

table does not exists,select 1 from tablename limit 1

感觉非常奇怪。

1.第一直觉是应该没有业务会写类似:

select 1 from tablename limit 1

这样的代码。搜了一遍业务代码之后,发现确实没有这样的代码存在。

2.报错里面的tablename是临时表的名字,是随机生成的,而非常奇怪的是,几乎每个临时表都会出现在日志中

那么就将产生的原因归结到生成和是使用临时表的代码中。

但是读了一遍代码,几乎每个地方都做了严格的判断,应该是不会出现日志中的类似用法和表不存在的情况的。

3.苦思良久,看到了这样一句:

df.write().jdbc(String.format("jdbc:postgresql://%s:%s/%s", ip, port, database), tbRandomName, props);

主要是将dataframe保存到pg中去,这个API的效果是,如果指定的pg表不存在的话,会帮忙建表;然后想了下,会不会是spark判断它自己需不需要帮忙建表呢,执行的select 1 from tablename limit 1。

4.测试了一下:


果然就会出现:


原来是spark的API做的判断,害得我担心了好半天,以为代码业务逻辑出现问题了。

翻开spark的源码,确实是有这样一句:


### SQL 查询中使用 NOT EXISTS 子句的示例 在 SQL 查询中,`NOT EXISTS` 子句用于检查子查询是否不返回任何行。 `NOT IN` 不同,`NOT EXISTS` 通常更高效,因为它会在找到第一个匹配项后停止进一步搜索[^3]。 以下是一个使用 `NOT EXISTS` 子句的示例查询: ```sql -- 示例:从 BigTable 中选择所有不在 SmallTable 中的记录 SELECT ID, City FROM BigTable WHERE NOT EXISTS ( SELECT ID FROM SmallTable WHERE SmallTable.ID = BigTable.ID ); ``` 此查询的功能是从 `BigTable` 中选择那些 `ID` 值不在 `SmallTable` 中的记录[^2]。`NOT EXISTS` 子句通过检查子查询是否返回空结果集来实现这一功能[^4]。 ### 性能比较 在某些数据库引擎中,`NOT EXISTS` 的性能可能优于 `NOT IN`,尤其是在处理包含 NULL 值的数据时[^1]。这是因为 `NOT IN` 在遇到 NULL 值时可能会导致意外结果,而 `NOT EXISTS` 则不会受到影响[^3]。 ### 转换为 `EXISTS` 的示例 有时可以将基于 `IN` 的 SQL 查询重写为使用 `EXISTS` 的形式。例如,以下查询展示了如何将 `IN` 替换为 `EXISTS`: ```sql -- 使用 IN 的原始查询 SELECT id, category_id, htmlfile, title, convert(varchar(20), begintime, 112) as pubtime FROM tab_oa_pub WHERE is_check = 1 AND category_id IN ( SELECT convert(int, no) FROM tab_oa_pub_cate WHERE no = '1' ) ORDER BY begintime DESC; -- 修改为使用 EXISTS 的查询 SELECT id, category_id, htmlfile, title, convert(varchar(20), begintime, 112) as pubtime FROM tab_oa_pub WHERE is_check = 1 AND EXISTS ( SELECT id FROM tab_oa_pub_cate WHERE tab_oa_pub.category_id = convert(int, no) AND no = '1' ) ORDER BY begintime DESC; ``` 上述示例展示了如何将 `IN` 子句替换为 `EXISTS`,从而可能提高查询性能[^4]。 ### 注意事项 - `NOT EXISTS` 和 `NOT IN` 的行为在处理 NULL 值时有所不同。`NOT IN` 遇到 NULL 值时可能会返回意外结果,而 `NOT EXISTS` 则不会受此影响。 - 数据库优化器可能会对 `NOT EXISTS` 和 `NOT IN` 进行不同的处理,因此在实际应用中需要根据具体场景进行测试[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值