You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hive.apache.org by "Denys Kuzmenko (Jira)" <ji...@apache.org> on 2026/10/15 18:34:00 UTC
[jira] [Resolved] (HIVE-30164) Iceberg: DESCRIBE, SHOW CREATE TABLE and getColumns report VARIANT columns as struct
[ https://issues.apache.org/jira/browse/HIVE-30164?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Denys Kuzmenko resolved HIVE-30164.
-----------------------------------
Fix Version/s: NA
Resolution: Duplicate
Fixed by HIVE-30170
> Iceberg: DESCRIBE, SHOW CREATE TABLE and getColumns report VARIANT columns as struct<metadata:binary,value:binary>
> ------------------------------------------------------------------------------------------------------------------
>
> Key: HIVE-30164
> URL: https://issues.apache.org/jira/browse/HIVE-30164
> Project: Hive
> Issue Type: Sub-task
> Components: Iceberg integration
> Reporter: Denys Kuzmenko
> Priority: Major
> Fix For: NA
>
>
> HMS stores an Iceberg VARIANT column as {{variant}}, and so does the Iceberg schema. HS2, however, derive Iceberg column types from the SerDe's ObjectInspector, and {{VariantObjectInspector}} is a struct inspector.
>
> {code:sql}
> create table t (v variant) stored by iceberg tblproperties ('format-version'='3');
> describe t; -- v struct<metadata:binary,value:binary>
> show create table t; -- `v` struct<`metadata`:binary, `value`:binary>
> show tblproperties t('current-schema'); -- ... "type":"variant" ...
> {code}
>
> JDBC {{DatabaseMetaData.getColumns}} with an embedded HMS also returns TYPE_NAME {{struct<metadata:binary,value:binary>}} and DATA_TYPE {{Types.STRUCT}}. A standalone HMS returns {{variant}}.
> Reusing the SHOW CREATE TABLE column list creates an Iceberg {{struct<metadata: binary, value: binary>}} column, so the variant type is silently lost.
>
> *Cause:* HIVE-27694 added {{HiveIcebergSerDe}} to the MetastoreConf default of {{metastore.serdes.using.metastore.for.schema}}, but not to HiveConf's {hive.serdes.using.metastore.for.schema}}. {{MetastoreConf.getVar}} falls back to the {{hive.*}} key, which HiveConf always sets. As a result, HS2 and an embedded HMS read Iceberg columns from the deserializer, while a standalone HMS reads the stored schema. {{HBaseSerDe}} (HIVE-29484) has the same drift; it was not tested here.
> *Second gap:* with {{HiveIcebergSerDe}} added to the HiveConf list, DESCRIBE shows {{variant}}, but SHOW CREATE TABLE fails:
> {noformat}
> java.lang.RuntimeException: Unknown type: VARIANT
> at org.apache.hadoop.hive.ql.ddl.DDLPlanUtils.formatType(DDLPlanUtils.java:972)
> at org.apache.hadoop.hive.ql.ddl.DDLPlanUtils.getColumns(DDLPlanUtils.java:917)
> at org.apache.hadoop.hive.ql.ddl.DDLPlanUtils.getCreateTableCommand(DDLPlanUtils.java:892)
> at org.apache.hadoop.hive.ql.ddl.table.create.show.ShowCreateTableOperation.execute(ShowCreateTableOperation.java:61)
> {noformat}
>
> *Proposed fix:* align the HiveConf default with MetastoreConf, and handle VARIANT in {{DDLPlanUtils.formatType}}.
> Query result types and {{typeof()}} still report struct after this fix; they are tracked in HIVE-30166.
>
>
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)