Presto使用avro_schema_url创建Hive Avro表后无法查询数据如何解决
Presto创建指定外部Avro Schema的Hive表查询报错解决方案
该报错本质是Presto在解析外部Avro Schema时出现了类型映射不匹配或Schema读取失败的问题,可按以下步骤依次排查解决:
- 校验Avro Schema文件合法性与类型匹配性
首先确认hello.avsc是符合JSON语法规范的合法Avro Schema文件,重点核对Schema中定义的字段名、字段类型和建表语句中声明的完全一致:比如建表时声明的id字段类型为bigint,对应Schema中的id类型必须为long(可选带null Union),不能为int等其他类型,字段名大小写也要完全匹配。同时不要在Schema中使用Presto不支持的复杂自定义逻辑类型、未声明的类型别名,避免触发类型解析失败。 - 修正avro_schema_url配置
当前配置的是相对路径,需修改为Presto Coordinator和所有Worker节点都能正常访问的分布式存储全路径,比如HDFS路径hdfs://nameservice1/my/datalake/schema/folder/hello.avsc、对象存储路径s3://bucket_name/my/datalake/schema/folder/hello.avsc,同时确认Presto运行用户对该Schema文件拥有读权限。如果使用本地路径,必须保证所有Presto节点的对应路径下都存放了该Schema文件。 - 调整建表语句写法
可省略建表时的字段声明,让Presto直接从外部Avro Schema中自动同步字段定义,避免手动声明字段和Schema不一致的问题,语句示例如下:CREATE TABLE hive.psa_sbox.avro_testing WITH ( format = 'AVRO', external_location = 'my/datalake/data/folder/avro_data', avro_schema_url = 'my/datalake/schema/folder/hello.avsc' ) - 通过Hive中转建表
以上方法都不生效时,可先在Hive侧完成Avro表的创建,指定avro.schema.url参数关联Schema文件,Hive对Avro Schema的兼容性更强,建表成功后直接在Presto中访问该Hive表即可,不会触发类型反序列化报错。
内容的提问来源于stack exchange,提问作者Maqsood
相关产品推荐
相关产品推荐

