0

我在 Cloudera QuickStart VM 上使用 CentOS。我在另一个问题How to save DataFrame directly to Hive? .

构建.sbt

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.5.2"
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.5.2"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.10" % "1.5.2"
libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.5.2"
libraryDependencies += "org.apache.spark" %% "spark-hive" % "1.5.2"

我想使用 DataFrame 作为 Hive 表,如下所示:

 recordDF.registerTempTable("mytempTable")
 hiveContext.sql("create table productstore as select * from mytempTable"); 

我注意到我收到了错误:

根暂存目录:/tmp/hive 应该是可写的。当前权限为:rwx------

我关注了其他问题并chmod 777/tmp/hiveHDFS 设置。

我突然想到 spark 使用本地文件系统 /tmp/hive。

我为本地文件系统做了一个 chmod。

现在我收到错误

org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:file:/user/hive/warehouse/productstore 不是目录或无法创建目录)

我想在 HDFS 配置单元仓库中存储一个 DataFrame。

4

1 回答 1

1

这里有两个问题。

问题 #1 - 权限

在 CentOS(或其他 Unix 风格)上,例如 Linux 或 macOS,只需执行以下操作:

chmod -R 777 /tmp/hive

(应该对操作系统上的任何人都可写,因为它是一个临时目录)。

问题 #2 - Hive Metastore 目录

由于您使用 Cloudera QuickStart VM,因此您使用的是 Spark 2.0 之前的版本(也许是 1.6.3?)。

该问题是由于path在将 DataFrame 持久化到 Hive 表时未指定。

默认情况下使用该目录/user/hive/warehouse,为避免写入该目录,请在使用方法或使用路径选项path保存到 Hive 表时定义该选项。optionsave

df.write.option("path", "[path-here]").saveAsTable("tableName")

从 Spark 2.0 开始,上述行将写入本地 Hive 元存储(使用 Derby),该元存储位于Spark 属性spark-warehouse指定的当前目录中。spark.sql.warehouse.dir

2.0.2要升级,请使用(not )定义您的 Spark 依赖项1.5.2

libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.0.2"

(只需一行就可以让 Spark SQL 支持 Hive)。

然后,您可以使用hive.metastore.warehouse.dirspark.sql.warehouse.dir设置 Spark 仓库并指向其他 Hive 表所在的 HDFS。

于 2016-12-25T19:37:36.597 回答