我在Cloudera QuickStart VM上使用CentOS . 我按照另一个问题How to save DataFrame directly to Hive?创建了一个受sbt管理的Spark应用程序 .
build.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");
我注意到我收到错误:
root scratch目录:/ tmp / hive应该是可写的 . 目前的权限是:rwx ------
我按照其他问题设置 chmod 777
为HDFS中的 /tmp/hive
.
我突然想到使用本地文件系统/ tmp / hive的火花 .
我为本地文件系统做了一个chmod .
现在我收到了错误
org.apache.hadoop.hive.ql.metadata.HiveException:MetaException(消息:文件:/ user / hive / warehouse / productstore不是目录或无法创建目录)
我想在HDFS配置单元仓库中存储DataFrame .
1 回答
这里有两个问题 .
问题#1 - 权限
在CentOS(或其他Unix版本)上,例如Linux或macOS,只需执行以下操作:
(由于它是一个临时目录,因此应该可以为操作系统上的任何人写入) .
问题#2 - Hive Metastore目录
既然您使用的是Cloudera QuickStart VM,那么您可以使用pre-Spark 2.0(也许是1.6.3?) .
问题是由于在将DataFrame持久保存到Hive表时未指定
path
.默认情况下使用目录
/user/hive/warehouse
并避免写入目录,使用option
方法或带路径选项的save
保存到Hive表时定义path
选项 .从Spark 2.0开始,上面的行将写入当前目录中的Hive Metastore(使用Derby),该目录由
spark.sql.warehouse.dir
Spark属性指定为spark-warehouse
.要升级,请使用
2.0.2
(不是1.5.2
)定义Spark依赖项:(只需要一行就可以获得支持Hive的Spark SQL) .
然后,您可以使用
hive.metastore.warehouse.dir
或spark.sql.warehouse.dir
设置Spark仓库并指向其他Hive表所在的HDFS .