scala增量嵌套理解

scala increment nested for comprehension

我正在努力检测给定数据集 (spark) 中的 PI/SI 信息。我有一套规则(csv 格式)如下

Rule_No,Target,Pattern,Fuzzy_Match,EPDR,Category,Active
1,Name,name,true,PI - Name,General/ID,true
1,Name,identity,true,PI - Name,General/ID,true
1,Content,Smith,true,PI - Name,General/ID,true
1,Content,Jones,true,PI - Name,General/ID,true
1,Content,Williams,true,PI - Name,General/ID,true
5,Name,Gender,true,PI - Gender,General/ID,true
5,Content,M,false,PI - Gender,General/ID,true
5,Content,F,false,PI - Gender,General/ID,true
5,Content,Male,false,PI - Gender,General/ID,true
5,Content,Female,false,PI - Gender,General/ID,true

我想做的是遍历数据集列并应用这些规则中的每一个来检查特定列是否具有 PII。 所以说如果我有一个名为 name 的列,并且给定的规则说使用 Smith 模式扫描该列的内容。如果找到匹配项,我将知道此列是 PI 列,然后移至下一列并应用每条规则,直到找到匹配项。 我正在使用嵌套理解来迭代列列表和规则列表。我想要的是当我找到一个匹配项时我想移动到下一列而不是应用剩余的规则。 我写过这样的代码

for {
      c <- ds.columns.toList
      rule <- rules if rule.active && checkPII(ds, c, rule.target, rule.pattern, rule.fuzzyMatch)
    } yield {
      <return PII information>
    }

但这会将每个规则应用于同一列,即使它匹配。我怎样才能移动到下一列而不是继续应用剩余的规则?

for 变成一个 map 调用,它总是检查每个元素。您需要使用 collectFirst,它会在第一次匹配时停止。

ds.columns.toList.flatMap { c =>
  rules.collectFirst {
    case rule if rule.active && checkPII(ds, c, rule.target, rule.pattern, rule.fuzzyMatch) =>
      <return PII information>
  }
}

使用 flatMap 意味着它将丢弃失败的匹配项,而只是 return 一个匹配值列表。