我正在尝试创建一个带有分区的外部配置单元表。我的一些列名有大写字母。这在创建表时导致了一个问题,因为带有大写字母的列名的值返回为null。然后我修改了parquetsorde,以便它通过使用serdeproperty来处理这个问题,这是使用外部表(而不是分区的)。现在,我尝试创建一个带有分区的外部表,每当我尝试访问大写列(例如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'
1条答案
按热度按时间j91ykkif1#
这是一个老问题,但是分区列必须区分大小写,因为它存储在unix文件系统中。
路径“/columnname=value/”始终与unix中的路径“/columnname=value/”不同
因此,在配置单元中使用不区分大小写的列名应该被认为是一种不好的做法。