我正在尝试使用分区创建外部HIVE表。我的一些 列名称包含大写字母。这在创建时引起了问题 表,因为大写字母的列名的值是 返回为NULL。然后我修改了ParquetSerDe以便它 通过使用SERDEPROPERTIES来处理这个问题,而这正在使用外部表(未分区)。现在我 尝试创建一个带有分区的外部表,每当我尝试时 访问大写列(例如FieldName)我收到此错误。 从tablename中选择FieldName;
FAILED: RuntimeException Java. Lang.RuntimeException: cannot find field
FieldName from
[org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@4f45884b,
org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@8f11f27,
org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@77e8eb0e,
org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@1dae4cd,
org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@623e336d
]
你能想到什么建议吗?我无法更改数据源的架构。
这是我用来创建表的命令 -
CREATE EXTERNAL TABLE tablename (fieldname string)
PARTITIONED BY (partion_name string)
ROW FORMAT SERDE 'path.ModifiedParquetSerDeLatest'
WITH SERDEPROPERTIES ("casesensitive"="FieldName")
STORED AS INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat'
OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat'
然后添加分区:
ALTER TABLE tablename ADD PARTITION (partition_name='partitionvalue')
LOCATION '/path/to/data'
答案 0 :(得分:1)
这是一个老问题,但分区列必须区分大小写,因为存储它的unix文件系统。
路径" / collumnname = value /"总是不同于路径" / collumnName = value /"在unix中
因此,依赖Hive的不区分大小写的列名称应该被认为是一种不好的做法。