【问题标题】:HiveContext in Spark Version 2Spark 版本 2 中的 HiveContext
【发布时间】:2017-07-03 16:51:05
【问题描述】:

我正在开发一个将数据帧插入 Hive 表的 spark 程序,如下所示。

import org.apache.spark.sql.SaveMode
import org.apache.spark.sql._
val hiveCont =  val hiveCont = new org.apache.spark.sql.hive.HiveContext(sc)
val partfile = sc.textFile("partfile")
val partdata = partfile.map(p => p.split(","))
case class partc(id:Int, name:String, salary:Int, dept:String, location:String)
val partRDD  = partdata.map(p => partc(p(0).toInt, p(1), p(2).toInt, p(3), p(4)))
val partDF   = partRDD.toDF()
partDF.registerTempTable("party")
hiveCont.sql("insert into parttab select id, name, salary, dept from party")

我知道 Spark V2 已经出来了,我们可以在其中使用 SparkSession 对象。 我们可以使用 SparkSession 对象直接将数据帧插入 Hive 表中,还是我们也必须使用版本 2 中的 HiveContext ?谁能告诉我与 HiveContext 版本的主要区别是什么?

【问题讨论】:

    标签: apache-spark hive


    【解决方案1】:

    您可以使用SparkSession(通常称为sparkss)直接触发sql 查询(确保在创建spark-session 时启用hive-support):

    spark.sql("insert into parttab select id, name, salary, dept from party")
    

    但我建议使用这种表示法,您不需要创建临时表等:

    partDF
    .select("id","name","salary","dept")
    .write.mode("overwrite")
    .insertInto("parttab")
    

    【讨论】:

    • 哦!因此,从 Spark 版本 2x 开始,我可以直接使用 sparkSession 对象将数据帧插入到现有的 Hive 表中。我的理解正确吗?
    • @Sidhartha 是的,SparkSession 是一切的主要入口点,HiveContextSqlContext 不再需要
    • @Raphael Roth 我读到在 spark-shell 之外我们仍然需要进行区分。但也许这只是我现在认为的 1.6。所以我认为我们不能为 Hive 表和 tempview 使用相同的名称。
    • 但是通过SQL插入和覆盖没有区别吗?
    • @thebluephantom 我不知道。对于 Dataframe API,如果已经有数据,默认情况下会抛出异常,或者您可以选择附加或覆盖。对于 spark SQL 有一个 INSERT OVERWRITE,所以我猜这不是默认的 (docs.databricks.com/spark/latest/spark-sql/language-manual/…)
    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多