具有镶木地板数据格式的配置单元表重新排序列
hive tables with parquet data format reorder columns
我们使用的是 hive 1.1.0,需要对具有 100 列的巨大 table 之一的列重新排序,以提高用户可读性。但是,当我们对 table 中的列重新排序时,它会因以下错误而失败。
重新排列列的替代方法是在 table 上创建一个视图。
hive> desc test_parquet;
OK
name string
age int
dept string
salary string
city string
# Partition Information
# col_name data_type comment
city string
Time taken: 0.053 seconds, Fetched: 10 row(s)
hive> ALTER TABLE test_parquet REPLACE COLUMNS (age int,name string, dept string, salary string);
OK
Time taken: 0.451 seconds
hive> desc test_parquet;
OK
age int
name string
dept string
salary string
city string
# Partition Information
# col_name data_type comment
city string
Time taken: 0.051 seconds, Fetched: 10 row(s)
hive> select * from test_parquet;
OK
Failed with exception java.io.IOException:java.lang.UnsupportedOperationException: Cannot inspect org.apache.hadoop.io.IntWritable
Time taken: 0.121 seconds
ALTER TABLE ... REPLACE COLUMNS
在元数据级别(metastore)工作。
新的列顺序与实际数据不匹配。
对于镶木地板,您会得到一个例外,对于文本文件,您将得到 NULL 值。
您应该使用替代解决方案 - 使用视图。
这个post有点老了,但是,我认为如果有类似的问题,它会对其他人有所帮助!
您可以试试下面的改列方法,效果不错:
ALTER TABLE test_parquet CHANGE COLUMN age age int FIRST;
将列移到第一位,否则,如果您想在特定列之后重新排序,以下内容会有所帮助:
ALTER TABLE test_parquet CHANGE COLUMN name name string AFTER age;
我们使用的是 hive 1.1.0,需要对具有 100 列的巨大 table 之一的列重新排序,以提高用户可读性。但是,当我们对 table 中的列重新排序时,它会因以下错误而失败。
重新排列列的替代方法是在 table 上创建一个视图。
hive> desc test_parquet;
OK
name string
age int
dept string
salary string
city string
# Partition Information
# col_name data_type comment
city string
Time taken: 0.053 seconds, Fetched: 10 row(s)
hive> ALTER TABLE test_parquet REPLACE COLUMNS (age int,name string, dept string, salary string);
OK
Time taken: 0.451 seconds
hive> desc test_parquet;
OK
age int
name string
dept string
salary string
city string
# Partition Information
# col_name data_type comment
city string
Time taken: 0.051 seconds, Fetched: 10 row(s)
hive> select * from test_parquet;
OK
Failed with exception java.io.IOException:java.lang.UnsupportedOperationException: Cannot inspect org.apache.hadoop.io.IntWritable
Time taken: 0.121 seconds
ALTER TABLE ... REPLACE COLUMNS
在元数据级别(metastore)工作。
新的列顺序与实际数据不匹配。
对于镶木地板,您会得到一个例外,对于文本文件,您将得到 NULL 值。
您应该使用替代解决方案 - 使用视图。
这个post有点老了,但是,我认为如果有类似的问题,它会对其他人有所帮助!
您可以试试下面的改列方法,效果不错:
ALTER TABLE test_parquet CHANGE COLUMN age age int FIRST;
将列移到第一位,否则,如果您想在特定列之后重新排序,以下内容会有所帮助:
ALTER TABLE test_parquet CHANGE COLUMN name name string AFTER age;