【问题标题】:Get all matching partition which matches regex in hive获取与配置单元中的正则表达式匹配的所有匹配分区
【发布时间】:2021-07-04 01:18:46
【问题描述】:

我有一个配置单元表,它是多列上的分区。 我需要获取带有部分分区名称的分区列表。

例如:表 foo_table 是分区上的

| PARTITIONED BY (                                   |
|   `dt` string COMMENT 'Custom Partition.',         |
|   `h` string COMMENT 'Custom Partition.',          |
|   `b` string COMMENT 'Custom Partition.',          |
|   `sv` string COMMENT 'Custom Partition',          |
|   `p` string COMMENT 'Custom Partition',           |
|   `dc` string COMMENT 'Custom Partition')

现在我需要获取所有分区让我们说 dt=somevalue
如果我给出所有分区列的值,则下面的代码有效。

List<String> list = ...
list.add("dt=2021-02-01/h=19/b=30/sv=1/p=03/dc=aa")
List<Partition> partitions = HiveMetaStoreClient.getPartitionsByNames(database, tableName, list)

但是如果我想通过只给出dt=2021-02-01/h=19this 来获取分区是行不通的。

List<String> list = ...
list.add("dt=2021-02-01/h=19") 
//OR
list.add("dt=2021-02-01/h=19/") 
//OR
list.add("dt=2021-02-01/h=19/*") 
//OR
list.add("dt=2021-02-01/h=19/b=*/sv=*/p=*/dc=*")
List<Partition> partitions = HiveMetaStoreClient.getPartitionsByNames(database, tableName, list)

如何做到这一点?

【问题讨论】:

  • 试试dt=2021-02-01/h=19/?带有斜杠。
  • @mck 刚刚试过,没用。
  • listPartitionsByFilter()listPartitionsByExpr() 方法,但它们只支持&gt;, &lt;, &gt;= etc. 样式的表达式,所以无论如何可能对你没用。
  • 我是 hive 新手,但这不是很常见的问题吗?

标签: java hadoop hive bigdata


【解决方案1】:

您可以使用 HiveMetaStoreClient 中提供的listPartitions 方法。

public List<Partition> listPartitions(String db_name,
                         String tbl_name,
                         List<String> part_vals,
                         short max_parts)
                           throws NoSuchObjectException,
                                  MetaException,
                                  org.apache.thrift.TException

您可以按照在 hive 表中添加的分区顺序查询分区。

示例:表 ProductByTypeHeight 分区 [type String, Height int]

缺点:一次只能查询一种分区。

List<String> pvals1 = new ArrayList<>(); 
        pvals1.add("fruit");
        List<String> pvals2 = new ArrayList<>();
        pvals2.add("vegetable");
        pvals2.add("450");
        List<List<String>> vals = new ArrayList<>();
        vals.add(pvals1);
        vals.add(pvals2);
        for (List<String> pval:vals) {
            List<Partition> pNameList = hiveMetaStoreConnector.listPartitions("productdb", "productbytypeheight", pval);
            pNameList.forEach(partition -> {
                List<String> partitionValues = partition.getValues();
                for (int i = 0; i < partitionValues.size(); i++) {
                    System.out.print(partitionValues.get(i) + " ");
                }
                System.out.println();
            });
        }

输出:

fruit 600 
fruit 450 
fruit 400 
vegetable 450 

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 2017-12-20
    • 2016-11-04
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2012-08-07
    • 2013-06-12
    • 2014-01-07
    相关资源
    最近更新 更多