hadoop - 蜂巢插入覆盖目录存储为镶木地板创建的具有默认名称的列
问题描述
如果我按如下方式运行配置单元插入覆盖查询以以镶木地板格式存储数据,则列名将默认为 _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)
解决方案
只有当元存储和 parquet 模式中的表定义完全匹配,或者只有模式末尾的添加时,列索引才能正常工作。而当使用列名时,模式演变没有问题。以下是三种情况,它们hive.parquet.use-column-names = true
在默认情况下起作用并中断hive.parquet.use-column-names = false
:
- 该列已添加到 Metastore 中的模式,但不存在于 parquet 文件中。
- 该列已添加到镶木地板文件中,但不存在于 Metastore 的模式中。
- Metastore 中架构中的列顺序与镶木地板文件中的顺序不匹配。
推荐阅读
- android - 来自应用程序的 R 类中未包含的某些库模块的字符串
- node.js - 如何在 Mac 上的 Dropbox 中递归地忽略 node_modules
- python - txt文件中的Python编号段落
- python - xlsx 工作表上的 NLP - 单列
- javascript - vue - 切换状态时变换旋转不会旋转回来
- c# - 我如何更改 Microsoft.ReportViewer.WinForms 中的报告显示
- python - 为什么我的代码将小数检测为不是数值
- javascript - 使用 Jest 和测试库测试元素是否至少聚焦一次
- dbt - `dbt run --select x` 给出错误`Could not find selector named x, expected one of []`
- scala - 为什么 ArrayBuffer 在 RDD 转换后被删除?