Чтение значений из конфигурации в 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 и меньше пользователей.