赞
踩
前段时间我在海豚上打包程序写hive出现了一个问题,spark程序向hive写数据时,报了如下bug,
- org.apache.spark.sql.AnalysisException:
- The format of the existing table test.xx is 'HiveFileFormat'
- It doesn't match the specified format 'ParquetFIleFormat'
一开始我以为是我再hue上创建hive建的表,建表格式大致如下
-
- create table if not exists test.xx (
- id int,
- name string
- )
- stored as PARQUET
-
-
- /**
- *created by: Matrix70
- *blog: https://blog.csdn.net/qq_52128187?type=blog
- */
后来我删了建,把分区也删了,parquet格式也加了,还是报这个问题,因此排除是建表问题
后来我看代码,入库的语句如下,死活写不进去
- println("===========开始入库========")
- userFrame.write.mode.("overwrite").saveAsTable("test.xx")
后来我换了 一种写法,写进去了。
- println("===========开始入库========")
- userFrame.write.mode.("overwrite").insertInto("test.xx")
如上,为什么会这样呢,我想了一下,
insertInto
方法将 DataFrame 的数据插入到一个已经存在的Hive表中,如果该表已经存在,则直接将数据插入到该表中,如果表不存在,则会抛出异常。如果表存在,但是表结构和DataFrame结构不匹配,则会抛出异常。
saveAsTable
方法将DataFrame保存为一个Hive表。如果表不存在,则会自动创建该表,如果表已经存在,则会用DataFrame的数据覆盖该表中的数据。与insertInto
方法不同的是,saveAsTable
方法可以自动创建表,而不需要手动创建表。此外,saveAsTable
方法还可以指定其他的存储格式,如ORC、Parquet等。
所以如果我不使用插入的方法,还是要使用 saveAsTable的话,就是这样写
- println("===========开始入库========")
- userFrame.write.mode("overwrite").format("parquet").saveAsTable("test.xx")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。