更新时间:2022-02-22 GMT+08:00

为什么创建Hive表失败?

问题

为什么创建Hive表失败?

回答

当源表或子查询具有大数据量的Partition时,创建Hive表失败。执行查询需要很多的task,此时输出的文件数就会很多,从而导致driver OOM。

可以在创建Hive表的语句中增加distribute by子句来解决这个问题,其中distribute by的字段要选取合适的cardinality(即distinct值的个数)。

distribute by子句限制了Hive表的Partition数量。增加distribute by 子句后,最终的输出文件数取决于指定列的cardinality和“spark.sql.shuffle.partitions”参数值。但如果distribute by的字段的cardinality值很小,例如,“spark.sql.shuffle.partitions”参数值为200,但distribute by字段的cardinality只有100,则输出的200个文件中,只有其中100个文件有数据,剩下的100个文件为空文件。也就是说,如果选取的字段的cardinality过低,如1,则会造成严重的数据倾斜,从而严重影响查询性能。

因此,建议选取的distribute by字段的cardinality个数要大于“spark.sql.shuffle.partitions”参数,可大于2~3倍。

示例:

create table hivetable1 as select * from sourcetable1 distribute by col_age;