记录几个近期spark里面写表踩的坑.
一般情况, spark写表的时候做好列对齐, 然后直接老一套的sql就行
不过还是有一些需要注意的点, 处理不好就会导致数据被删, 问题非常大.
sql写入
相对比较稳妥的方式
指定dt的时候不需要改动态覆盖, 动态dt的时候务必修改为动态覆盖
比如代码
1 | # 指定分区的情况 |
这里我们第一种写法不需要修改, 第二种写法必须指定覆盖模式为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做数据写入脚本的编写, 务必在小心小心再小心的基础之上, 再注意以上这几个点.