引用数据 JOIN(Azure 流分析)
通常,我们使用事件处理引擎来计算延迟很低的流数据。 在许多情况下,用户需要将永久保留的历史数据或者变化缓慢的数据集(又称引用数据)与实时事件流关联,以便就系统做出更明智的决策。 例如,将我的事件流联接到静态数据集,以将 IP 地址映射到相关位置。 在不需要临时绑定的流分析中,这是唯一受支持的 JOIN 操作。 引用数据还可用于具有特定于设备的阈值。
示例
如果某商用车在 Toll Company 登记,则它们无需停车检查,即可通过收费站。 我们将使用商用车登记查找表来标识所有登记期已过的商用车。
SELECT I1.EntryTime, I1.LicensePlate, I1.TollId, R.RegistrationId
FROM Input1 I1 TIMESTAMP BY EntryTime
JOIN Registration R
ON I1.LicensePlate = R.LicensePlate
WHERE R.Expired = '1'
引用数据 JOIN 的特殊性
- 如果使用引用数据,则 JOIN 要求定义引用数据的输入源。
- 内部 JOIN 支持引用数据 JOIN, (默认) 和左外部 JOIN,引用数据位于 JOIN 运算符的右侧。
- 数据类型是计算联接谓词 (
ON
子句) 的一个重要方面。 不同数据类型上的类似值 (1.0
和"1"
) 可能不匹配。 建议将键显式转换为通用类型。 - 引用数据只能是静态 (加载) 或动态 (定期刷新) 。 但是,即使在动态情况下,引用数据也不会使时间进度,因此左侧的流需要获取新事件才能生成输出。 有关详细信息,另请参阅 Azure 流分析中的时间进度 。
性能注意事项
为防止性能下降,应通过简单的键相等性 () ON
定义引用联接谓词 (ON s.myKey = r.myKey
子句) 。 使用复杂表达式或不等式会在内部导致交叉联接,后跟筛选器 (完全扫描与查找) ,这可能会对整体延迟产生严重影响。
如果可能,请将这些复杂表达式移动到 WHERE
查询步骤的 子句,或者使用更简单的条件多次联接相同的引用数据。