【问题标题】:Insert data into a Hive table with HiveContext using Spark Scala使用 Spark Scala 使用 HiveContext 将数据插入 Hive 表
【发布时间】:2016-06-02 14:38:52
【问题描述】:

我能够使用 HiveContext 将数据从我的 spark 代码插入 Hive 表,如下所示

   val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
   sqlContext.sql("CREATE TABLE IF NOT EXISTS e360_models.employee(id INT, name STRING, age INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'")

   sqlContext.sql("insert into table e360_models.employee select t.* from (select 1210, 'rahul', 55) t")
   sqlContext.sql("insert into table e360_models.employee select t.* from (select 1211, 'sriram pv', 35) t")
   sqlContext.sql("insert into table e360_models.employee select t.* from (select 1212, 'gowri', 59) t")

   val result = sqlContext.sql("FROM e360_models.employee SELECT id, name, age")
   result.show()

但是,这种方法是在仓库中为每个插入创建一个单独的文件,如下所示

part-00000
part-00000_copy_1
part-00000_copy_2
part-00000_copy_3

有什么方法可以避免这种情况,只需将新数据附加到单个文件中,还是有其他更好的方法可以将数据从 spark 插入到 hive 中?

【问题讨论】:

  • 你解决了这个问题了吗?我做了一些研究,但没有运气!

标签: scala hadoop apache-spark hive apache-spark-sql


【解决方案1】:

不,没有办法做到这一点。每个新插入都会创建一个新文件。这不是 Spark “问题”,而是您也可以使用 Hive 体验的一般行为。唯一的方法是使用所有数据的 UNION 执行单次插入,但如果您需要执行多次插入,您将拥有多个文件。

您唯一能做的就是在 hive 中启用文件合并(在此处查看:Hive Create Multi small files for each insert in HDFShttps://cwiki.apache.org/confluence/display/Hive/Configuration+Properties)。

【讨论】:

  • 这些单个文件会占用 64mb(默认块大小)* 3(复制因子)还是只是文件的实际大小 * 复制因子?
  • 我想你可以在这里找到答案:stackoverflow.com/questions/13012924/…
猜你喜欢
  • 2019-07-20
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 2016-09-08
  • 2017-05-06
相关资源
最近更新 更多