11.2. presto读取hive的parquet表

11.2.1. 无法读取 Parquet 文件

使用 Presto 查询 Hive 表,抛异常 com.facebook.presto.spi.PrestoException: Can not read value at 0 in block 0 in file hdfs

Presto 版本 0.211

Spark 版本 2.2.0

导致问题的原因是 Spark 写入到 Hive 表中的 Parquet 文件版本过高,导致 Presto 无法读取

解决办法:

在构建 SparkSession 时,添加配置 spark.sql.parquet.writeLegacyFormat,一个🌰:

SparkSession.builder()
  .master("local")
  .appName(appName)
  .enableHiveSupport()
  .config("spark.sql.parquet.writeLegacyFormat", true) // ①
  .getOrCreate()
① 在 Spark 2.2 中,在写入 Parquet 时,会启动 Legacy 模式,从而可以兼容 Spark 1.4 及之前的版本

11.2.2. Presto 查询到错误的列

Presto 查询文件格式为 Parquet 的 Hive 表,查询其中一个字段却返回另一个字段的数据,数据格式匹配不上,无法查看到最新数据

Presto 版本 0.211

导致该问题的原因是查询 Hive 表 Schema 和底层 Parquet 数据文件 Schema 不一致导致的。改问题有两种解决方式:

修改 Hive 表 Schema 保持与底层 Parquet 数据文件 Schema 一致;
修改 Hive Catalog 配置文件,新增配置 hive.parquet.use-column-names=true
关于 hive.parquet.use-column-names 属性,官方的解释:

By default, columns in Parquet files are accessed by their ordinal position in the Hive table definition. To access columns based on the names recorded in the Parquet file, set hive.parquet.use-column-names=true in your Hive catalog properties file.

11.2.3. Hive 元数据缓存

有时 Hive 底层数据文件发生变化,由于 Presto 缓存了 Hive 元数据。禁用 Hive 元数据缓存,编辑 Hive 配置文件,添加以下配置:

hive.metastore-cache-ttl=0
hive.metastore-refresh-interval=0