我在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 dir:/ tmp / hive应该是可写的。当前权限是:rwx ------
我关注了其他问题,并为HDFS中的chmod 777
设置了/tmp/hive
。
我突然想到使用本地文件系统/ tmp / hive。
我为本地文件系统做了一个chmod。
现在我收到错误
org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(消息:文件:/ user / hive / warehouse / productstore不是 目录或无法创建一个)
我想在HDFS配置单元仓库中存储DataFrame。
答案 0 :(得分:1)
这里有两个问题。
在CentOS(或其他Unix版本)上,例如Linux或macOS,只需执行以下操作:
chmod -R 777 /tmp/hive
(由于它是临时目录,因此应该可以为操作系统上的任何人写入)。
由于您使用的是Cloudera QuickStart VM,您可以使用pre-Spark 2.0(也许是1.6.3?)。
问题是由于在将DataFrame保存到Hive表时未指定path
。
默认使用目录/user/hive/warehouse
并避免写入目录,使用path
方法或option
方法保存到Hive表时定义save
选项路径选项。
df.write.option("path", "[path-here]").saveAsTable("tableName")
从Spark 2.0开始,上面的代码将写入本地Hive Metastore(使用Derby),它位于当前目录中spark-warehouse
,由spark.sql.warehouse.dir
Spark属性指定。
要升级,请使用2.0.2
(不是1.5.2
)定义您的Spark依赖项:
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.0.2"
(只需要一行就可以获得支持Hive的Spark SQL)。
然后,您可以使用hive.metastore.warehouse.dir
或spark.sql.warehouse.dir
设置Spark仓库并指向其他Hive表所在的HDFS。