@@ -58,6 +58,14 @@ object DynamicBloomFilterPruning extends Rule[LogicalPlan]
58
58
}.headOption
59
59
}
60
60
61
+ private def hintToBuildBloomFilterLeft (hint : JoinHint ): Boolean = {
62
+ hint.leftHint.exists(_.strategy.contains(BLOOM_FILTER_JOIN ))
63
+ }
64
+
65
+ private def hintToBuildBloomFilterRight (hint : JoinHint ): Boolean = {
66
+ hint.rightHint.exists(_.strategy.contains(BLOOM_FILTER_JOIN ))
67
+ }
68
+
61
69
private def rowCounts (plan : LogicalPlan ): BigInt = {
62
70
plan.stats.rowCount
63
71
.getOrElse(plan.stats.sizeInBytes / EstimationUtils .getSizePerRow(plan.output))
@@ -164,24 +172,24 @@ object DynamicBloomFilterPruning extends Rule[LogicalPlan]
164
172
val leftDistCnt = distinctCounts(l, left)
165
173
val rightDistCnt = distinctCounts(r, right)
166
174
167
- if (isRightSideSmall && canPruneLeft(joinType) && rightRowCnt > 0 &&
168
- ! rightHasScalarSubquery &&
169
- rightRowCnt <= conf.dynamicBloomFilterJoinPruningMaxBloomFilterEntries &&
170
- ! hasDynamicBloomFilterPruningSubquery(right) && ! right.isStreaming &&
171
- getFilterableTableScan(l, left).exists(p =>
172
- ! hasSelectivePredicate(p) &&
173
- pruningHasBenefit(rightRowCnt, rightDistCnt, leftDistCnt, p))) {
175
+ if (canPruneLeft(joinType) && (hintToBuildBloomFilterRight(hint) ||
176
+ (isRightSideSmall && rightRowCnt > 0 && ! rightHasScalarSubquery &&
177
+ rightRowCnt <= conf.dynamicBloomFilterJoinPruningMaxBloomFilterEntries &&
178
+ ! hasDynamicBloomFilterPruningSubquery(right) && ! right.isStreaming &&
179
+ getFilterableTableScan(l, left).exists(p =>
180
+ ! hasSelectivePredicate(p) &&
181
+ pruningHasBenefit(rightRowCnt, rightDistCnt, leftDistCnt, p)) ))) {
174
182
newLeft = insertPredicate(l, newLeft, r, right, rightKeys, rightDistCnt, rightRowCnt)
175
183
newHint = newHint.copy(leftHint = Some (HintInfo (strategy = Some (NO_BROADCAST_HASH ))))
176
184
}
177
185
178
- if (isLeftSideSmall && canPruneRight(joinType) && leftRowCount > 0 &&
179
- ! leftHasScalarSubquery &&
180
- leftRowCount <= conf.dynamicBloomFilterJoinPruningMaxBloomFilterEntries &&
181
- ! hasDynamicBloomFilterPruningSubquery(left) && ! left.isStreaming &&
182
- getFilterableTableScan(r, right).exists(p =>
183
- ! hasSelectivePredicate(p) &&
184
- pruningHasBenefit(leftRowCount, leftDistCnt, rightDistCnt, p))) {
186
+ if (canPruneRight(joinType) && (hintToBuildBloomFilterLeft(hint) ||
187
+ (isLeftSideSmall && leftRowCount > 0 && ! leftHasScalarSubquery &&
188
+ leftRowCount <= conf.dynamicBloomFilterJoinPruningMaxBloomFilterEntries &&
189
+ ! hasDynamicBloomFilterPruningSubquery(left) && ! left.isStreaming &&
190
+ getFilterableTableScan(r, right).exists(p =>
191
+ ! hasSelectivePredicate(p) &&
192
+ pruningHasBenefit(leftRowCount, leftDistCnt, rightDistCnt, p)) ))) {
185
193
newRight = insertPredicate(r, newRight, l, left, leftKeys, leftDistCnt, leftRowCount)
186
194
newHint = newHint.copy(rightHint = Some (HintInfo (strategy = Some (NO_BROADCAST_HASH ))))
187
195
}
0 commit comments