如何将Dataframe持久化到配置单元表?

y3bcpkx1  于 2021-06-28  发布在  Hive
关注(0)|答案(1)|浏览(376)

我在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。

9q78igpj

9q78igpj1#

这里有两个问题。

问题1-权限

在centos(或其他unix风格)上,例如linux或macos,只需执行以下操作:

chmod -R 777 /tmp/hive

(由于它是一个临时目录,所以应该为操作系统上的任何人编写)。

问题2-配置单元元存储目录

因为您使用的是cloudera quickstart vm,所以您使用的是pre-spark 2.0(可能是1.6.3?)。
这个问题是由于没有 path 在将Dataframe持久化到配置单元表时指定。
目录 /user/hive/warehouse 默认情况下使用,为避免写入目录,请定义 path 使用保存到配置单元表时的选项 option 方法或 save 使用路径选项。

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

从spark2.0开始,上面的一行将写入当前目录中的本地hivemetastore(使用derby) spark-warehouse 按规定 spark.sql.warehouse.dir Spark特性。
要升级,请使用 2.0.2 (不是 1.5.2 ):

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

(只要一行代码就可以让sparksql支持hive)。
然后你可以使用 hive.metastore.warehouse.dir 或者 spark.sql.warehouse.dir 设置spark仓库并指向其他配置单元表所在的hdfs。

相关问题