Scala меняет путь паркета в конфиге (typesafe)

В настоящее время у меня есть такой файл конфигурации:

project {
  inputs {
    baseFile {
      paths = ["project/src/test/resources/inputs/parquet1/date=2020-11-01/"]
      type = parquet
      applyConversions = false
    }
  }
}

И я хочу изменить дату 2020-11-01 на другую во время выполнения. Я читал, что мне нужен новый объект конфигурации, так как он неизменяем, я пытаюсь это сделать, но я не совсем уверен, как редактировать пути, так как это список, а не строка, и это определенно должен быть список, иначе он скажет Я не настроил путь для паркета.

val newConfig = config.withValue("project.inputs.baseFile.paths"(0),
        ConfigValueFactory.fromAnyRef("project/src/test/resources/inputs/parquet1/date=2020-10-01/"))

Но я получаю:

Error com.typesafe.config.ConfigException$BadPath: path parameter: Invalid path 'project.inputs.baseFile.': path has a leading, trailing, or two adjacent period '.' (use quoted "" empty string if you want an empty element)

Как правильно установить новый путь?


person l3rn1ngData    schedule 09.12.2020    source источник


Ответы (1)


Один из вариантов, который у вас есть, - переопределить весь массив:

import scala.collection.JavaConverters._
val mergedConfig = config.withValue("project.inputs.baseFile.paths",
                      ConfigValueFactory.fromAnyRef(Seq("project/src/test/resources/inputs/parquet1/date=2020-10-01/").asJava))

Но более элегантный способ сделать это (ИМХО) — создать новый config и использовать существующий в качестве запасного варианта.

Например, мы можем создать новый config:

val newJsonString = """project {
                   |inputs {
                   |baseFile {
                   |  paths = ["project/src/test/resources/inputs/parquet1/date=2020-10-01/"]
                   |}}}""".stripMargin

val newConfig = ConfigFactory.parseString(newJsonString)

А теперь, чтобы объединить их:

val mergedConfig = newConfig.withFallback(config)

Результат:

println(mergedConfig.getList("project.inputs.baseFile.paths"))
println(mergedConfig.getString("project.inputs.baseFile.type"))

is:

SimpleConfigList(["project/src/test/resources/inputs/parquet1/date=2020-10-01/"])
parquet

Как и ожидалось.

Вы можете узнать больше об об объединении деревьев конфигурации. Код запускается по адресу Scastie.

Я не нашел способа заменить один элемент массива на withValue.

person Tomer Shetah    schedule 09.12.2020