Spark SQL 2.0.0 坑 小记

问题出现

这个异常已在 Spakr SQL 2.0.1 中修复

使用 IDEA 配置好 Spark SQL 2.0.0 开始使用

 // 构建会话
 val ss: SparkSession =SparkSession.builder
                                    .master("local")
                                    .appName("Word Count")
                                    .getOrCreate()
// 读取文件
val jsonData: DataFrame = ss.read.json("indata/data.json")

运行会产生一个路径异常

java.net.URISyntaxException: Relative path in absolute URI: file:E:/IdeaProject/SparkDemo/spark-warehouse

问题解决

// 构建 Spark SQL 会话
        val ss: SparkSession = SparkSession.builder
            .master("local")
            .appName("Word Count")
            .config("spark.sql.warehouse.dir", "项目根路径")
            .getOrCreate()

问题解析

查看源码发现,这个问题出在 SQLConf.scala 里面

  • 源码目录:org.apache.spark.sql.internal.SQLConf

提取相关源码

// 默认配置模板
val WAREHOUSE_PATH = SQLConfigBuilder("spark.sql.warehouse.dir")
    .doc("The default location for managed databases and tables.")
    .stringConf
    .createWithDefault("file:${system:user.dir}/spark-warehouse")
   
// 替换 模板里的路径,问题就出现这个替换的上
def warehousePath: String = {
    getConf(WAREHOUSE_PATH).replace("${system:user.dir}", System.getProperty("user.dir"))
  }

我们可以把这段逻辑简化一下

使用这段代码 System.getProperty("user.dir") 替换路径,输出结果发现 其中的含有 \,这就是异常的原因

val path = "file:${system:user.dir}/spark-warehouse".replace("${system:user.dir}", System.getProperty("user.dir"))
println(path)
--------------
file:E:\IdeaProject\SparkDemo/spark-warehouse

官方修复动态

管方已在 Spark SQL 2.0.1 版本中修复这个BUG

修复代码如下

val WAREHOUSE_PATH = SQLConfigBuilder("spark.sql.warehouse.dir")
    .doc("The default location for managed databases and tables.")
    .stringConf
    .createWithDefault("${system:user.dir}/spark-warehouse")


def warehousePath: String = {
    new Path(getConf(WAREHOUSE_PATH).replace("${system:user.dir}",
      System.getProperty("user.dir"))).toString
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值