我正在尝试创建一个带分区的外部 HIVE 表。我的一些 列名有大写字母。这在创建时引起了问题 表,因为带有大写字母的列名的值是 返回为 NULL。然后我修改了 ParquetSerDe 以使其 通过使用 SERDEPROPERTIES 来处理这个问题,这是在使用外部表(未分区)。现在我 尝试创建一个带分区的外部表,每当我尝试 访问大写列(例如 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'
最佳答案
这是一个老问题,但是分区列必须区分大小写,因为它存储在 unix 文件系统上。
路径“/columnname=value/”总是不同于 unix 中的路径“/columnName=value/”
因此,Hive 依赖不区分大小写的列名应该被视为一种不好的做法。
关于hadoop - Hive 中区分大小写的列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24767158/