如何将DataFrame持久化到Hive表?

时间:2016-12-25 19:04:55

标签: apache-spark hive hdfs apache-spark-2.0

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

1 个答案:

答案 0 :(得分:1)

这里有两个问题。

问题#1 - 权限

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

chmod -R 777 /tmp/hive

(由于它是临时目录,因此应该可以为操作系统上的任何人写入)。

问题#2 - Hive Metastore目录

由于您使用的是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.dirspark.sql.warehouse.dir设置Spark仓库并指向其他Hive表所在的HDFS。