在Scala中,如果我有以下配置:
id = 777
username = stephan
password = DG#%T@RH
想法是打开一个文件,将其转换为字符串,对其执行getLines
并根据左侧键获取右侧值。将常量配置值读入我的应用程序的最佳代码是什么?
客户使用情况:val username = config.get("username")
答案 0 :(得分:22)
最好的方法是使用.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
即可知道如何使用它。
答案 1 :(得分:0)
您可以在json文件(我将其命名为config.json)中配置以下值
{
"id": "777",
"username": "stephan",
"password": "DG#%T@RH"
}
现在,您可以将此json文件存储在hdfs位置,并在scala中使用spark从hdfs位置读取此文件,并读取以下配置值:
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参数的option选项,因为您的json文件将在新行中包含每个值。如果您不使用它,则会出现错误,提示 _corrupt_record:字符串
答案 2 :(得分:0)
如果您的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和更少的用户。