spark踩坑记录

记录几个近期spark里面写表踩的坑.

一般情况, spark写表的时候做好列对齐, 然后直接老一套的sql就行

不过还是有一些需要注意的点, 处理不好就会导致数据被删, 问题非常大.

sql写入

相对比较稳妥的方式

指定dt的时候不需要改动态覆盖, 动态dt的时候务必修改为动态覆盖

比如代码

1
2
3
4
5
6
7
8
9
# 指定分区的情况
insert_sql = f'INSERT OVERWRITE TABLE {target_table} PARTITION (dt="{dt}") SELECt * from tmp_table'

# 未指定分区的情况
# 记得加上这里的conf, 否则会删表
spark.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")
insert_sql = f'INSERT OVERWRITE TABLE {target_table} PARTITION (dt) SELECt * from tmp_table'

spark.sql(insert_sql)

这里我们第一种写法不需要修改, 第二种写法必须指定覆盖模式为dynamic, 否则会删表.

这个是spark2.3之后必须做的, 这个参数默认"static", 务必修改.

saveAsTable和insertInto

saveAsTable

saveAsTable好处是动态写(可以用于直接创建表), mode可以设置"overwrite"或者"append".

针对saveAsTable, 我们设置partitionOverwriteMode没有意义

overwrite模式下, 无论怎么设置partitionOverwriteMode, 一定会删除原有的所有数据 append模式下, 无论怎么设置, 都是会新增多一个分区.

insertInto

类似于sql的写入, 但是需要注意partitionOverwriteMode.

append的情况下, 总是新增分区

overwrite模式下, 配置了dynamic写入, 则覆盖同名分区, 其他分区不变;

如果static或者默认不做配置, 则删除所有分区

AI问题

目前就我自己的经验来看, AI对df的直接写入几乎是没有认知的, 且非常喜欢用saveAsTable, 一旦指定mode为overwrite, 就会导致删表问题.

如果使用AI做数据写入脚本的编写, 务必在小心小心再小心的基础之上, 再注意以上这几个点.