Spark 2.0中读取本地Parquet文件

3
在Spark 1.6.2中,我可以通过非常简单的方式读取本地Parquet文件:
SQLContext sqlContext = new SQLContext(new SparkContext("local[*]", "Java Spark SQL Example"));
DataFrame parquet = sqlContext.read().parquet("file:///C:/files/myfile.csv.parquet");
parquet.show(20);

我正在尝试升级到Spark 2.0.0,并通过运行以下命令来实现:

SparkSession spark = SparkSession.builder().appName("Java Spark SQL Example").master("local[*]").getOrCreate();
Dataset<Row> parquet = spark.read().parquet("file:///C:/files/myfile.csv.parquet");
parquet.show(20);

这是在Windows上运行的,使用intellij(Java项目),目前没有使用hadoop集群(稍后会用到,但目前我只是想让处理逻辑正确并熟悉API)。

不幸的是,在使用spark 2.0运行时,代码会抛出异常:

Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: file:C:/[my intellij project path]/spark-warehouse
at org.apache.hadoop.fs.Path.initialize(Path.java:206)
at org.apache.hadoop.fs.Path.<init>(Path.java:172)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.makeQualifiedPath(SessionCatalog.scala:114)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.createDatabase(SessionCatalog.scala:145)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.<init>(SessionCatalog.scala:89)
at org.apache.spark.sql.internal.SessionState.catalog$lzycompute(SessionState.scala:95)
at org.apache.spark.sql.internal.SessionState.catalog(SessionState.scala:95)
at org.apache.spark.sql.internal.SessionState$$anon$1.<init>(SessionState.scala:112)
at org.apache.spark.sql.internal.SessionState.analyzer$lzycompute(SessionState.scala:112)
at org.apache.spark.sql.internal.SessionState.analyzer(SessionState.scala:111)
at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:49)
at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:64)
at org.apache.spark.sql.SparkSession.baseRelationToDataFrame(SparkSession.scala:382)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:143)
at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:427)
at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:411)
at lili.spark.ParquetTest.main(ParquetTest.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.net.URISyntaxException: Relative path in absolute URI: file:C:/[my intellij project path]/spark-warehouse
at java.net.URI.checkPath(URI.java:1823)
at java.net.URI.<init>(URI.java:745)
at org.apache.hadoop.fs.Path.initialize(Path.java:203)
... 21 more

我不知道为什么它试图触碰我的项目目录 - 是否有任何配置细节我错过了?在Spark 1.6.2中默认是合理的,但在2.0中不再是这样吗?换句话说,在Windows上读取本地Parquet文件的最简单方法是什么?

1个回答

3
似乎你遇到了与SPARK-15893相关的问题。Spark的开发人员从1.6.2版本到2.0.0版本更改了文件读取方式。从JIRA的评论中可以看出,你需要进入conf\spark-defaults.conf文件并添加以下内容:
"spark.sql.warehouse.dir=file:///C:/Experiment/spark-2.0.0-bin-without-hadoop/spark-warehouse"

您应该能够像这样加载parquet文件:
DataFrame parquet = sqlContext.read().parquet("C:/files/myfile.csv.parquet");

非常感谢!我需要停止假设开源项目的最新版本是完美无缺的,并检查它们的JIRA ;) 实际上,目录可以设置为任何内容(不需要hadoop安装),也可以通过系统属性进行设置,如链接的JIRA https://issues.apache.org/jira/browse/SPARK-15899 所述。 - Lili
使用较新版本的Spark时,您可以只使用路径字符串spark.read.parquet,而不需要任何额外的复杂性,至少在使用本地主节点时。 - matanster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接