What is a broadcast join in Spark, and under what conditions should you use it to optimize your jobs?