Spark Shell自动导入的Scala包及Regex类两种使用方式疑问
Spark Shell自动导入与Regex使用疑问
问题背景
Scala文档说明启动会话时会自动导入java.lang.*和scala.*,因此在Spark Shell(v2.4.0)中,我原本以为无需手动导入scala.util.matching.Regex就能使用Regex类,但实际测试发现:
未导入时执行直接实例化代码会报错:
scala> val my_regex = new Regex(".*") <console>:23: error: not found: type Regex
但通过字符串的r方法却能成功生成Regex实例:
scala> val my_regex = ".*".r my_regex: scala.util.matching.Regex = .*
针对这个现象,提出两个问题:
- Spark Shell启动时会自动导入哪些内容?
- 为何第二种方式可以使用Regex类?
解答
1. Spark Shell启动时的自动导入内容
Spark Shell的自动导入包含两层:
- Scala语言默认自动导入:
java.lang._:Java核心类库,比如String、Integer等基础类型无需手动导入scala._:Scala核心包的直接成员(注意:该导入不会递归子包,像scala.util这类子包下的类不会被自动引入)scala.Predef._:Scala预定义工具包,包含大量简化开发的方法、隐式转换和类型别名,是Scala默认必导的内容
- Spark专属自动导入:
为了方便Spark开发,Shell会额外自动导入org.apache.spark.SparkContext._、org.apache.spark.SparkConf._以及SparkSession相关的核心成员,避免每次手动导入Spark API。
2. 为何".*".r能成功生成Regex实例
核心原因是Scala的隐式转换与预定义方法:
- 默认导入的
scala.Predef._中包含一个隐式转换,能把普通String对象转换成StringOps类的实例 StringOps类内置了r方法,该方法内部会直接创建并返回scala.util.matching.Regex对象——整个过程中,r方法已经内部引用了Regex类,而StringOps本身通过Predef被自动导入,所以不需要你手动导入Regex类- 而直接
new Regex(".*")失败,是因为scala.util.matching.Regex属于scala.util子包,不在scala._的自动导入范围内(scala._仅导入scala包下的直接成员,不递归导入子包内容),必须手动添加import scala.util.matching.Regex才能直接引用这个类。
内容的提问来源于stack exchange,提问作者piptoma
相关产品推荐
相关产品推荐

