首页 > 解决方案 > 如何理解这个语法?案例 streamingRelation@StreamingRelation(dataSourceV1, sourceName, output)

问题描述

在阅读结构化流式传输的源代码时,我对这个语法感到困惑。

在 microBatchExecution.scala

val _logicalPlan = analyzedPlan.transform {
     case streamingRelation@StreamingRelation(dataSourceV1, sourceName, 
output) =>
    toExecutionRelationMap.getOrElseUpdate(streamingRelation, {
      // Materialize source to avoid creating it in every batch
      val metadataPath = s"$resolvedCheckpointRoot/sources/$nextSourceId"
      val source = dataSourceV1.createSource(metadataPath)
      nextSourceId += 1
      logInfo(s"Using Source [$source] from DataSourceV1 named 
'$sourceName' [$dataSourceV1]")
      StreamingExecutionRelation(source, output)(sparkSession)
    })
……
 }

我的问题:

  1. 如何理解案例 streamingRelation@StreamingRelation(dataSourceV1, sourceName, output)?

  2. “@”在这里的作用是什么?

标签: scala

解决方案


有许多不同的方法可以进行模式匹配:

您可以按类型将整个对象捕获到变量:

 case streamingRelation: StreamingRelation => 
     //do something with object of type StreamingRelation bound to variable streamingRelation

或者你可以解构它:

case StreamingRelation(dataSourceV1, sourceName, output) => 
    //do something with members of an object like dataSourceV1, sourceName etc.

@结合两者的语法:

case streamingRelation@StreamingRelation(dataSourceV1, sourceName, output) =>
  //both whole object is available as streamingRelation and all matched members like dataSourceV1, sourceName

推荐阅读