scala шаг, вложенный для понимания - PullRequest
1 голос
/ 05 марта 2020

Я работаю над обнаружением информации 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>
    }

, но он будет применять каждое правило к одному и тому же столбцу, даже если оно соответствует. Как перейти к следующему столбцу вместо того, чтобы продолжать применять остальные правила?

1 Ответ

2 голосов
/ 05 марта 2020

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 означает, что оно отбрасывает неудачные совпадения и просто возвращает список совпадающих значений.

...