Spark 2.0:绝对URI中的相对路径(spark-warehouse)

时间:2016-07-30 00:25:27

标签: windows apache-spark pyspark apache-spark-sql pyspark-sql

我尝试从Spark 1.6.1迁移到Spark 2.0.0,并且在尝试将csv文件读入SparkSQL时遇到了一个奇怪的错误。以前,当我在pyspark中从本地磁盘读取文件时,我会这样做:

Spark 1.6

df = sqlContext.read \
        .format('com.databricks.spark.csv') \
        .option('header', 'true') \
        .load('file:///C:/path/to/my/file.csv', schema=mySchema)

在最新版本中,我认为它应该是这样的:

Spark 2.0

spark = SparkSession.builder \
           .master('local[*]') \
           .appName('My App') \
           .getOrCreate()

df = spark.read \
        .format('csv') \
        .option('header', 'true') \
        .load('file:///C:/path/to/my/file.csv', schema=mySchema)

但无论我尝试调整路径的方式有多少,我都会收到此错误:

IllegalArgumentException: 'java.net.URISyntaxException: Relative path in 
absolute URI: file:/C:/path//to/my/file/spark-warehouse'

不确定这只是Windows的一个问题,还是我缺少的东西。我很高兴spark-csv软件包现在已成为Spark的一部分开箱即用,但我似乎无法再阅读任何本地文件了。有什么想法吗?

1 个答案:

答案 0 :(得分:27)

我能够在最新的Spark文档中进行一些挖掘,我注意到他们有一个我之前没有注意到的新配置设置:

spark.sql.warehouse.dir

所以我在设置SparkSession时继续添加此设置:

spark = SparkSession.builder \
           .master('local[*]') \
           .appName('My App') \
           .config('spark.sql.warehouse.dir', 'file:///C:/path/to/my/') \
           .getOrCreate()

这似乎设置了工作目录,然后我可以直接将我的文件名提供给csv阅读器:

df = spark.read \
        .format('csv') \
        .option('header', 'true') \
        .load('file.csv', schema=mySchema) 

一旦我设置了火花仓库,Spark就能找到我的所有文件,我的应用程序现在已成功完成。令人惊奇的是它的运行速度比Spark 1.6快20倍。所以他们真的做了一些非常令人印象深刻的优化他们的SQL引擎激发它!