Нужна помощь в решении ошибки несоответствия типов (значение не является членом Double) в Scala - PullRequest
0 голосов
/ 18 июня 2020

Я использую библиотеку Amazon Deequ Scala для проверки качества данных. Формат для вызова методов в библиотеке Deequ ниже

  checks = hasDistinctness(Seq("column1","column2"), _ >= 0.70)

Я планировал пройти проверку условий (> = 0.70) из файла конфигурации.

код:

 val chk_val  = config.getString("chk_val")  
 println(chk_val)    // ">= 0.70"
 checks = hasDistinctness(Seq("column1","column2"),_ chk_val) 

Определение метода в библиотеке Deequ:

def hasDistinctness(
  columns: Seq[String], assertion: Double => Boolean,
  hint: Option[String] = None)
: CheckWithLastConstraintFilterable = {

addFilterableConstraint { filter => distinctnessConstraint(columns, assertion, filter, hint) }
 }

Ошибка:

Ошибка: значение chk_val не является членом Double

Как решить этот вопрос?

1 Ответ

2 голосов
/ 18 июня 2020

_ >= 0.70 - функция, которая сравнивает свой элемент с 0,70. обессахаривая _, это будет выглядеть как value => value >= o.70

Компилятор понимает _ chk_val как вызов chk_val постфиксной нотации для всего, что передается в функцию. Без шугаринга это будет выглядеть как value => value.chk_val

Очевидно, что в Double нет члена chk_val - и это именно то, что вам сообщает компилятор.

Итак, _ не является black magi c - он не просто волшебным образом разбирает строку и превращает ее в исполняемый код :) Чтобы получить условие из файла конфигурации, вам нужно будет преобразовать его в функцию - наверное, самый простой ( и рискованно, и, вероятно, компилятор не будет проверять его тип) заключается в использовании какой-то функции eval (например, см. этот ответ или этот вопрос ).

Более быстрый, простой и понятный (но, вероятно, менее гибкий и менее масштабируемый) подход состоит в том, чтобы, вероятно, определить парсер самостоятельно. Что-то вроде:

def parseCondition(input: String): Double => Boolean = {
  val splitInput = input.split(" ")
  // You might want to add some validation - e.g. ">=0.7" will just throw here
  val (operator, operand) = (splitInput.first, splitInput.last)
  operator match {
     case ">=": _ >= operand
     case ">": _ > operand
     case "<": _ < operand
     ...
  }
}

Или, может быть, использовать Atto ::

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...