如何从 spark sql 访问本地镶木地板文件?

Posted

技术标签:

【中文标题】如何从 spark sql 访问本地镶木地板文件?【英文标题】:How to access local parquet files from spark sql? 【发布时间】:2016-06-02 13:25:46 【问题描述】:

我正在使用 Dropwizard Web 服务来访问许多镶木地板文件,我需要使用“真实”的 sql(字符串)而不是 spark DDL(我已经尝试过并且确实有效,但不能满足我的需求) .我正在使用独立模式下的 spark 从 eclipse 启动服务。 Spark 版本是 1.4.1。

问题是 spark 无法解析纯 SQL 中的 parquet 引用,调用如下:(我在 ./bro/conn.parquet 中启动 Web 服务的文件夹中有一个测试副本)

DataFrame df = sqlContext
        .sql(sql)
        .limit(5)
;

例如

http://localhost:8080/table/query?sql=select%20ts%20from%20%20parquet.`./bro/conn.parquet` 

失败并出现如下所示的错误。对于该 sql 语句,我已经尝试了所有我能想到的排列方式(省略 ./、绝对路径、省略反引号等),但没有任何乐趣。

parquet 访问是通过 SQL 工作还是仅通过 DDL API(我不能用于这个用例)。有没有办法使用 DDL api 加载数据帧(DataFrame df = sqlContext.read().parquet(path)),然后将完整的 sql 命令(减去 from 子句)应用于结果?

0:0:0:0:0:0:0:1 - - [02/Jun/2016:12:47:06 +0000] "GET /table/query?sql=select%20ts%20from%20%20parquet.`./bro/conn.parquet` HTTP/1.1" 500 1483 74 74
ERROR [2016-06-02 13:02:29,810] com.yammer.dropwizard.jersey.LoggingExceptionMapper: Error handling a request: fc462d5554bce965
! java.lang.RuntimeException: Table Not Found: parquet../bro/conn.parquet
! at scala.sys.package$.error(package.scala:27)
! at org.apache.spark.sql.catalyst.analysis.SimpleCatalog$$anonfun$1.apply(Catalog.scala:115)
! at org.apache.spark.sql.catalyst.analysis.SimpleCatalog$$anonfun$1.apply(Catalog.scala:115)
! at scala.collection.MapLike$class.getOrElse(MapLike.scala:128)
! at scala.collection.AbstractMap.getOrElse(Map.scala:58)
! at org.apache.spark.sql.catalyst.analysis.SimpleCatalog.lookupRelation(Catalog.scala:115)
! at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.getTable(Analyzer.scala:222)
! at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$7.applyOrElse(Analyzer.scala:233)
! at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$7.applyOrElse(Analyzer.scala:229)
! at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:222)
! at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:222)
! at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:51)
! at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:221)
! at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:242)
...
0:0:0:0:0:0:0:1 - - [02/Jun/2016:13:02:29 +0000] "GET /table/query?sql=select%20ts%20from%20%20parquet.`./bro/conn.parquet` HTTP/1.1" 500 1483 20 20

【问题讨论】:

【参考方案1】:

这是由 spark-sql 1.4.1 中的错误引起的。升级到 1.6.1 修复了它。

【讨论】:

以上是关于如何从 spark sql 访问本地镶木地板文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将单个镶木地板文件从 s3 读入 dask 数据帧?

spark sql 无法在 S3 中查询镶木地板分区

在 Spark 2.0 中从 AVRO 写入镶木地板时出现 NullPointerException

如何确保镶木地板文件包含元数据中的行数?

如何使用具有不受支持类型的 Spark 读取镶木地板?

如何在镶木地板文件中使用 K-means