使用Presto读取以Parquet格式存储的TPCH表时,Presto表示列类型不正确

时间:2019-10-14 02:41:35

标签: parquet presto

我想测试以Parquet格式编码的本地TPCH数据的Presto性能。

我将用Parquet编码的TPCH表存储在文件夹/home/data/tpch下,并按如下方式预先创建表

create table hive.tpch_5.region 
       (regionkey int, name varchar, r_comment varchar) 
        with (format= 'PARQUET', external_location = 'file:///home/data/tpch/');

regionkey中选择效果很好。但是选择名称会导致以下错误:

Query 20191014_020453_00040_bfdq8 failed: The column name is declared as type string, but the Parquet file declares the column as type INT32

但是列name是BINARY。这是实木复合地板工具的输出

file schema: region 
-------------------------------------------------------------------------------------------------------------------
region_key:  REQUIRED INT32 R:0 D:0
name:        REQUIRED BINARY R:0 D:0
comment:     REQUIRED BINARY R:0 D:0

row group 1: RC:5 TS:712 OFFSET:4 
-------------------------------------------------------------------------------------------------------------------
region_key:   INT32 UNCOMPRESSED DO:0 FPO:4 SZ:43/43/1.00 VC:5 ENC:DELTA_BINARY_PACKED,BIT_PACKED
name:         BINARY UNCOMPRESSED DO:0 FPO:47 SZ:120/120/1.00 VC:5 ENC:DELTA_BYTE_ARRAY,BIT_PACKED
comment:      BINARY UNCOMPRESSED DO:0 FPO:167 SZ:549/549/1.00 VC:5 ENC:DELTA_BYTE_ARRAY,BIT_PACKED

非常感谢您的帮助!

这是我的hive.properties

connector.name=hive-hadoop2
hive.metastore=file
hive.metastore.catalog.dir=file:///home/harper/presto/hive-catalog
hive.metastore.user=harper
hive.allow-drop-table=true
hive.parquet.use-column-names=true          

更新10/14

我调试了presto服务器并找到了根本原因。该错误是从ParquetPageSourceFactory.getParquetType引发的,在这里我发现Presto从表lineitem.parquet中读取了架构,而不是读取区域的架构。事实证明,当我将所有tpch表放在同一目录下时,Presto并未按表名获取文件,而是假定该文件夹下的所有文件都属于同一表。

解决方案

为每个表创建单独的文件夹,然后将文件移动到其他目录。

1 个答案:

答案 0 :(得分:0)

Parquet列类型和DDL中定义的字段类型之间必须具有一定的兼容性。您在DDL中使用了不同的列名,这也可能是一个问题。尝试将DDL中的字段名称更改为Parquet文件中定义的名称。