首页 文章

如何将DataFrame持久化到Hive表?

提问于
浏览
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目录:/ 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

    这里有两个问题 .

    问题#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 并避免写入目录,使用 option 方法或带路径选项的 save 保存到Hive表时定义 path 选项 .

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

    从Spark 2.0开始,上面的行将写入当前目录中的Hive Metastore(使用Derby),该目录由 spark.sql.warehouse.dir Spark属性指定为 spark-warehouse .

    要升级,请使用 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 .

相关问题