最近在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的源码,确实是有这样一句: