sql
insert into hive.db.tb1 partition(dt)
select
aaa
,bbb
,dt
from hive.db.tb2
where xxx;
Q1:
报错: failed: line 1:38: mismatched input ‘partition’. Expecting: ‘(’, <query>
解决办法:
去掉sql中的partition(dt),presto写的时候不需要加这个
参考: https://stackoverflow.com/questions/61924103/insert-into-static-hive-partition-using-presto
Q2:
报错: failed: Catalog must be specified when session catalog is not set
解决办法:
presto写的时候,如果没指定session的catalog,需要在表名前添加catalog名
如上面的sql的 hive.db.tb1
Q3:
报错: Mismatch at column 3: ‘aaa’ is of type timestamp but expression is of type varchar
解决办法:
要写入的字段类型与查询出来的字段类型不匹配, 修改sql为
insert into hive.db.tb1
select
cast(aaa as timestamp)
,bbb
,dt
from hive.db.tb2
where xxx;
Q4:
报错: failed: No page sink provider for catalog 'hive’
解决办法:
把配置文件 ./etc/catalog/hive.properties 复制到每个presto节点
参考: https://stackoverflow.com/questions/48092203/presto-cannot-insert-values
Q5:
报错: failed: Cannot insert into an existing partition of Hive table: dt=202001
解决办法:
在 hive.properties 中设置
hive.immutable-partitions=false
不过按 官网 的说法,这个值默认是false,是指新数据是否能写入已存在的分区,按道理应该设置为true,而且我在hive.properties 中设置hive.immutable-partitions=true或不设置这个值的情况下,都会报上面这个错,不知道是不是bug
此外,按上面的设置后,presto可以正常插入数据,但在该hive表的hdfs分区目录下,每次插入新数据都会生成新文件,其中00000_0是hive之前已有的数据文件,其他是presto生成
并且,在hive中进行distinct或count查询会报错,目前还不知道怎么解决
Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
但在presto中就能正常查询到数据
20210129: 疑似解决办法 https://blog.csdn.net/lixiaoksi/article/details/106855509