首页 > 解决方案 > 蜂巢插入覆盖目录存储为镶木地板创建的具有默认名称的列

问题描述

如果我按如下方式运行配置单元插入覆盖查询以以镶木地板格式存储数据,则列名将默认为 _col0。我怎样才能避免它并强制执行 select 子句中的列名。

插入覆盖目录“某些位置”存储为 PARQUET 从员工中选择名称;

-- 生成的 parquet 文件被创建为列名为 "_col0" 而不是 "name"

有没有办法通过将一些属性传递给 serde 来克服这个问题?

hive> select * from employee;
OK
employee.id     employee.name   employee.salary
100     john doe        99999
101     jane doe        88888


hive> insert overwrite directory '/tmp/empdata' stored as parquet select name from employee;

scala> spark.read.parquet("/tmp/empdata").printSchema
root
 |-- _col0: string (nullable = true)

标签: hadoophiveparquet

解决方案


只有当元存储和 parquet 模式中的表定义完全匹配,或者只有模式末尾的添加时,列索引才能正常工作。而当使用列名时,模式演变没有问题。以下是三种情况,它们hive.parquet.use-column-names = true在默认情况下起作用并中断hive.parquet.use-column-names = false

  • 该列已添加到 Metastore 中的模式,但不存在于 parquet 文件中。
  • 该列已添加到镶木地板文件中,但不存在于 Metastore 的模式中。
  • Metastore 中架构中的列顺序与镶木地板文件中的顺序不匹配。

推荐阅读