当前位置:   article > 正文

Spark_SparkOnHive_海豚调度跑任务写入Hive表失败解决

Spark_SparkOnHive_海豚调度跑任务写入Hive表失败解决

背景

        前段时间我在海豚上打包程序写hive出现了一个问题,spark程序向hive写数据时,报了如下bug,

  1. org.apache.spark.sql.AnalysisException:
  2. The format of the existing table test.xx is 'HiveFileFormat'
  3. It doesn't match the specified format 'ParquetFIleFormat'

原因分析:

一开始我以为是我再hue上创建hive建的表,建表格式大致如下

  1. create table if not exists test.xx (
  2. id int,
  3. name string
  4. )
  5. stored as PARQUET
  6. /**
  7. *created by: Matrix70
  8. *blog: https://blog.csdn.net/qq_52128187?type=blog
  9. */

 后来我删了建,把分区也删了,parquet格式也加了,还是报这个问题,因此排除是建表问题

后来我看代码,入库的语句如下,死活写不进去

  1. println("===========开始入库========")
  2. userFrame.write.mode.("overwrite").saveAsTable("test.xx")

后来我换了 一种写法,写进去了。

  1. println("===========开始入库========")
  2. userFrame.write.mode.("overwrite").insertInto("test.xx")

结论

如上,为什么会这样呢,我想了一下,

  insertInto 方法将 DataFrame 的数据插入到一个已经存在的Hive表中,如果该表已经存在,则直接将数据插入到该表中,如果表不存在,则会抛出异常。如果表存在,但是表结构和DataFrame结构不匹配,则会抛出异常。

  saveAsTable方法将DataFrame保存为一个Hive表。如果表不存在,则会自动创建该表,如果表已经存在,则会用DataFrame的数据覆盖该表中的数据。与insertInto方法不同的是,saveAsTable方法可以自动创建表,而不需要手动创建表。此外,saveAsTable方法还可以指定其他的存储格式,如ORC、Parquet等。

所以如果我不使用插入的方法,还是要使用 saveAsTable的话,就是这样写

  1. println("===========开始入库========")
  2. userFrame.write.mode("overwrite").format("parquet").saveAsTable("test.xx")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/656445
推荐阅读
相关标签
  

闽ICP备14008679号