【问题标题】:scala increment nested for comprehensionscala增量嵌套理解
【发布时间】:2020-03-05 05:39:14
【问题描述】:

我正在努力检测给定数据集(火花)中的 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>
    }

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

【问题讨论】:

    标签: scala for-comprehension


    【解决方案1】:

    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 意味着它将丢弃失败的匹配项,只返回匹配值列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2018-12-25
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多