使用Spark Scala将数据插入HiveContext的Hive表中

时间:2016-06-02 14:38:52

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

我能够使用HiveContext(如下面的

)从我的火花代码中将数据插入到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插入配置单元?

1 个答案:

答案 0 :(得分:1)

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

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