配置单元插入覆盖目录,存储为镶木地板创建的具有默认名称的列

时间:2018-07-02 16:57:05

标签: hadoop hive parquet

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

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

-创建的实木复合地板文件的列名称为“ _col0”而不是“名称”

是否可以通过将一些属性传递给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)

1 个答案:

答案 0 :(得分:0)

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

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