使用spark scala将数据插入到具有hivecontext的配置单元表中

s3fp2yjn  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(312)

我可以使用如下所示的hivecontext将数据从spark代码插入到配置单元表中

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插入到配置单元中?

au9on6nz

au9on6nz1#

不,没有办法。每个新插入将创建一个新文件。这不是一个Spark“问题”,而是一个一般行为,你可以体验Hive太多。唯一的方法是使用所有数据的并集执行单个插入,但是如果需要执行多个插入,则会有多个文件。
唯一可以做的就是在hive中启用文件合并(请看这里:hive为hdfs和hive中的每个插入创建多个小文件)https://cwiki.apache.org/confluence/display/hive/configuration+properties).

相关问题