为分区数据定义Impala表模式

时间:2016-05-13 09:19:54

标签: sql database-schema pyspark impala

使数据框存储为镶木地板格式,并根据文件系统结构中一个或多个列的值物理地在不同文件上进行分区,如下所示:

|-region=Europe
|   |-processed=1
|   |   |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|   |-processed=2
|   |   |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|   |-processed=3
|   |   |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|   |-processed=4
|       |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|-region=Asia
|   |-processed=2
|   |   |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|   |-processed=4
|       |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|-region=America
|   |-processed=3
|       |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|-_SUCCESS

要使模式知道我正在手动添加每个分区的分区:

ALTER TABLE status_log ADD PARTITION (region='Europe', processed="1") LOCATION '/hdfs/status_logs/region=Europe/processed=1';
ALTER TABLE status_log ADD PARTITION (region='Europe', processed="2") LOCATION '/hdfs/status_logs/region=Europe/processed=2';
ALTER TABLE status_log ADD PARTITION (region='Europe', processed="4") LOCATION '/hdfs/status_logs/region=Europe/processed=2';
...
..
.

有没有办法定义表模式,以便它会读取Impala 树目录结构并自动推断分区架构? 或者是否总是需要自动将每个分区添加到表中?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

您可以使用配置单元,因为impala共享相同的Metastore,这应该不是问题。我假设在talbe status_logs的定义中,LOCATION设置为'/ hdfs / status_logs'。

in hive issue命令

def type_cast_from_database(value)
    if default_value?(value)
      value
    else
      coder.load(super)
    end
end

def default_value?(value)
    value == coder.load(nil) # HERE: Calls Serializer with nil
end

这将自动将所有分区添加到Metastore。 然后回到黑斑羚,你需要做的就是

msck repair table status_logs

你可以看到所有的分区。 验证你可以做(​​你可能已经知道了)。

invalidate metadata status_logs