配置单元插入覆盖目录存储为具有默认名称的parquet创建列

1tuwyuhd  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(375)

如果我运行一个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)
bvjxkvbb

bvjxkvbb1#

只有当metastore中的表定义和parquet模式完全匹配时,或者只有在模式末尾添加内容时,列索引才能正常工作。然而,当使用列名时,模式演化没有问题。这里有三个案例,当 hive.parquet.use-column-names = true 和默认值决裂 hive.parquet.use-column-names = false :
该列被添加到metastore中的架构中,但不存在于parquet文件中。
该列已添加到parquet文件,但在metastore的架构中不存在。
metastore中架构中的列顺序与parquet文件中的顺序不匹配。

相关问题