如果我运行一个hive insert overwrite查询来以parquet格式存储数据,那么列名将默认为\u col0。如何避免它并强制使用select子句中的列名。
插入覆盖目录“某处”存储为Parquet选择员工姓名;
--创建的结果Parquet文件的列名为“\u 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)
1条答案
按热度按时间bvjxkvbb1#
只有当metastore中的表定义和parquet模式完全匹配时,或者只有在模式末尾添加内容时,列索引才能正常工作。然而,当使用列名时,模式演化没有问题。这里有三个案例,当
hive.parquet.use-column-names = true
和默认值决裂hive.parquet.use-column-names = false
:该列被添加到metastore中的架构中,但不存在于parquet文件中。
该列已添加到parquet文件,但在metastore的架构中不存在。
metastore中架构中的列顺序与parquet文件中的顺序不匹配。