【问题标题】:Reading local parquet files in Spark 2.0在 Spark 2.0 中读取本地 parquet 文件
【发布时间】:2016-12-15 05:58:06
【问题描述】:

在 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 上的 spark 2.0 中读取本地 parquet 文件的最简单方法是什么?

【问题讨论】:

    标签: apache-spark spark-dataframe parquet


    【解决方案1】:

    您似乎遇到了SPARK-15893。 Spark 开发人员将文件读取从 1.6.2 更改为 2.0.0。 从 JIRA 上的 cmets,您应该转到 conf\spark-defaults.conf 文件并添加:

    "spark.sql.warehouse.dir=file:///C:/Experiment/spark-2.0.0-bin-without-hadoop/spark-warehouse"
    

    然后您应该能够像这样加载镶木地板文件:

    DataFrame parquet = sqlContext.read().parquet("C:/files/myfile.csv.parquet");
    

    【讨论】:

    • 非常感谢!我需要停止假设开源项目的新版本是完美的,并检查它们的 JIRA ;) 该目录实际上可以设置为任何内容(不需要安装 hadoop),也可以通过系统属性进行设置,根据已链接 JIRA issues.apache.org/jira/browse/SPARK-15899.
    • 使用(稍后?)spark 版本,您可以将spark.read.parquet 与路径字符串一起使用,没有任何额外的复杂性,至少在使用本地主机时是这样
    猜你喜欢
    • 2015-12-19
    • 2017-09-25
    • 2020-10-28
    • 2017-08-07
    • 1970-01-01
    • 2015-08-05
    • 2017-04-24
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多