假设我有一个代码:
val spark = SparkSession.builder().master("local").getOrCreate()
spark.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")
val partitionMode1 = spark.conf.get("spark.sql.sources.partitionOverwriteMode")
print(s"Partitioning: $partitionMode1")
val partitionMode2 = spark.sparkContext.getConf.get("spark.sql.sources.partitionOverwriteMode")
print(s"Partitioning: $partitionMode2")
此代码将因错误而失败
Exception in thread "main" java.util.NoSuchElementException: spark.sql.sources.partitionOverwriteMode
at org.apache.spark.SparkConf.$anonfun$get$1(SparkConf.scala:245)
at scala.Option.getOrElse(Option.scala:189)
如果我运行代码,我也不会在 Spark UI 环境中看到
partitionOverwriteMode
属性。
我知道我可以使用
val spark = SparkSession.builder().config("spark.sql.sources.partitionOverwriteMode", "dynamic").master("local").getOrCreate()
但想法是在创建会话后设置conf。
我的问题是使用
spark.conf.set
更新此类属性是否安全?
根据文档,Spark会话创建后,您将无法修改SparkConf。 https://spark.apache.org/docs/latest/api/scala/org/apache/spark/SparkConf.html
一旦 SparkConf 对象被传递到 Spark,它就会被克隆并且用户不能再修改。 Spark不支持在运行时修改配置。