Чтение значений из конфигурации в Scala

В Scala, если у меня есть следующий конфиг:

id = 777
username = stephan
password = DG#%[email protected]

Идея состоит в том, чтобы открыть файл, преобразовать его в строку, сделать getLines на нем и получить правое значение на основе левой клавиши. Что будет самым приятным кодом для чтения постоянных значений конфигурации в моем приложении?

Использование клиента: val username = config.get("username")

Ответ 1

Лучшим способом было бы использовать файл .conf и ConfigFactory вместо того, чтобы самостоятельно выполнять весь анализ файлов:

import java.io.File
import com.typesafe.config.{ Config, ConfigFactory }

// this can be set into the JVM environment variables, you can easily find it on google
val configPath = System.getProperty("config.path")

val config = ConfigFactory.parseFile(new File(configPath + "myFile.conf"))

config.getString("username")

Я обычно использую scalaz Validation для операции parseFile в случае, если файл не существует, но вы можете просто использовать try/catch, если вы не знаете, как его использовать.

Ответ 2

Вы можете настроить эти значения в файле json (я назвал его config.json), как показано ниже

{
  "id": "777",
  "username": "stephan",
  "password": "DG#%[email protected]"
}

Теперь вы можете сохранить этот json файл в папке hdfs и прочитать этот файл из папки hdfs, используя spark в scala, и прочитать значения конфигурации, как показано ниже:

val configData = spark.read.option("multiline",true).json("/tmp/user/config.json")
val id = configData.select("id").collect()(0)  
val username = configData.select("username").collect()(0)  
val password = configData.select("password").collect()(0)

В первой строке кода вам нужно использовать параметр с параметром multiline = true, так как ваш файл json будет иметь каждое значение в новой строке. если вы не используете его, вы получите сообщение об ошибке _corrupt_record: string

Ответ 3

Если версия Spark меньше 2.2, сначала преобразуйте содержимое файла JSON в строку JSON, т.е. преобразуйте содержимое файла в одну строку и загрузите его в папку HDFS.

Образец JSON:

{ 
  "planet" : "Earth",
  "continent" : "Antarctica"
}

Преобразовать в:

{ "planet" : "Earth", "continent" : "Antarctica"}

Далее для доступа к данным создайте фрейм данных:

val dataDF = spark.read.format("json").load("<HDFS location>")
val planet = dataDF.select("planet").collect(0).mkString("")

Надеюсь, что это поможет Spark 2.1 и меньше пользователей.