我在cloudera quickstart vm上使用centos。我创建了一个sbt管理的spark应用程序,下面是另一个问题:如何将Dataframe直接保存到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作为配置单元表,如下所示:
recordDF.registerTempTable("mytempTable")
hiveContext.sql("create table productstore as select * from mytempTable");
我注意到我得到了一个错误:
根目录scratch dir:/tmp/hive应该是可写的。当前权限为:rwx------
我接着问了其他的问题并设置了 chmod 777
对于 /tmp/hive
在hdfs中。
我突然想到spark使用本地文件系统/tmp/hive。
我为本地文件系统做了chmod。
现在我犯了个错误
org.apache.hadoop.hive.ql.metadata.hiveexception:元异常(message:file:/user/hive/warehouse/productstore不是目录或无法创建目录)
我想在hdfs hive仓库中存储一个Dataframe。
1条答案
按热度按时间9q78igpj1#
这里有两个问题。
问题1-权限
在centos(或其他unix风格)上,例如linux或macos,只需执行以下操作:
(由于它是一个临时目录,所以应该为操作系统上的任何人编写)。
问题2-配置单元元存储目录
因为您使用的是cloudera quickstart vm,所以您使用的是pre-spark 2.0(可能是1.6.3?)。
这个问题是由于没有
path
在将Dataframe持久化到配置单元表时指定。目录
/user/hive/warehouse
默认情况下使用,为避免写入目录,请定义path
使用保存到配置单元表时的选项option
方法或save
使用路径选项。从spark2.0开始,上面的一行将写入当前目录中的本地hivemetastore(使用derby)
spark-warehouse
按规定spark.sql.warehouse.dir
Spark特性。要升级,请使用
2.0.2
(不是1.5.2
):(只要一行代码就可以让sparksql支持hive)。
然后你可以使用
hive.metastore.warehouse.dir
或者spark.sql.warehouse.dir
设置spark仓库并指向其他配置单元表所在的hdfs。