【可能的原因】
1)表关联的时候,关联的键中存在大量的NULL值
2)字段(比如字段值为 -99 , ’’, null 等) 关联时产生的数据倾斜
【解决方法】
1)方法1:先筛选出key为非null的数据进行关联操作,再把key为null的数据拼接回去;

2)把空值的 key 变成一个字符串加上随机数,就能把倾斜的数据分到不同的reduce上(进行分块),解决数据倾斜问题。

问题表象:
两个不同的ETL(之前近一个月都是稳定运行)报同样的错误,重新点击运行后也能正常运行;
【原因】:进入环境,排查相应ETL,客户join后的数据帧较大,需要耗费较长时间,而程序默认spark.sql.broadcastTimeout配置属性默认值为5 * 60秒,即300sec,这个远远不够,随着客户ETL复杂度越来越高,这个报错会很频繁
【解决方案】所以建议设置一下spark.sql.broadcastTimeout参数,将它调大:如config("spark.sql.broadcastTimeout", "3600")
【原因】:大概率是这个字段ID发生了改变,比如输入数据集字段做了变动(可能是把这个字段删除又重新建了一个,导致字段id变化),但是ETL里保留的是原先的字段id,所以两个id对不上就会报丢失字段的错误。
【解决方案】:重新拖下字段就可以了。
【原因】:可能是字段类型的问题,比如数值字段如果替换为文本字段,那么就会报错。
【解决方案】:这种情况下可以在替换之前加一个新建字段的节点,转换下字段格式。
原因是超出了spark表broadcast join的限制,常见的情况可能是关联节点有无法匹配到数据的关联,导致关联后的值出现大量Null(这时数据会大量膨胀,在后续进行计算时,就容易超出了spark的broadcast join限制-8GB)