use*_*400 5 apache-spark spark-streaming
Spark Streaming 中 Append 模式和 Update 模式的真正区别是什么?
根据文档:
追加模式(默认) - 这是默认模式,只有自上次触发后添加到结果表中的新行才会输出到接收器。这仅支持添加到结果表中的行永远不会改变的那些查询。因此,这种模式保证每一行只输出一次(假设容错接收器)。例如,只有 select、where、map、flatMap、filter、join 等的查询将支持 Append 模式。
和
更新模式 -(自 Spark 2.1.1 起可用)只有自上次触发后更新的结果表中的行才会输出到接收器。更多信息将在未来版本中添加。
我对追加模式的困惑:它表示自上次触发器以来“仅”添加到结果表中的新行将被输出到接收器。所以,例如,假设我们有三行
r1, r2, r3到了t1, t2, t3哪里t1<t2<t3
现在说在 t4 行 r2 被覆盖了,如果是这样,当我们在追加模式下操作时,我们将永远不会在接收器中看到它?这不是像丢失一个写吗?
我对更新模式的困惑:它说“仅”自上次触发器以来更新的结果表中的行将输出到接收器。这是否意味着行应该已经存在,并且只有在更新现有行时才会输出到下沉?如果在此更新模式下没有现有行并且有新行进来会发生什么?
仔细看最新版本的文档中对Append模式的描述,我们看到它说
\n\n\n\n\n追加模式 - 只有自上次触发后追加到结果表中的新行才会写入外部存储。这仅适用于结果表中现有行预计不会更改的查询。
\n
换句话说,永远不应该有任何覆盖。在您知道可以更新的情况下,请使用更新模式。
\n\n对于有关更新模式的第二个问题,在文档中中完整的引用是
\n\n\n\n\n更新模式 - 只有自上次触发以来结果表中更新的行才会写入外部存储(自 Spark 2.1.1 起可用)。请注意,这与完整模式不同,该模式仅输出自上次触发以来已更改的行。如果查询不包含聚合,则相当于Append模式。
\n
最后一句话在这里很重要。相当于没有聚合时的Append模式(会进行实际更新)。因此,在此模式下,新行将正常添加,而不是简单地跳过。
\n\n为了完整起见,这是当前可用的第三种模式:
\n\n\n\n\n完整模式 - 整个更新的结果表将写入外部存储。由存储连接器决定如何处理整个表的写入。
\n
文档包含不同查询类型和支持的模式的列表以及一些有用的注释。
\n| 归档时间: |
|
| 查看次数: |
4598 次 |
| 最近记录: |