使用JAVA SDK删除Hive表的所有分区

问题描述 投票:0回答:1

我需要删除 Hive 表的所有现有分区。

我尝试搜索,但所有这些都在 Hive 查询中。

我的分区模式是

(year="2018"/month="01")
因此尝试表达
year>'0'

尝试探索“HiveMetaStoreClient”api,如下所示:

  public void dropAllPartitions(String hiveDb, String hiveTable) throws MetaException, NoSuchObjectException, TException {

    HiveMetaStoreClient client = new HiveMetaStoreClient(new HiveConf());

    ObjectPair<Integer,byte[]> objectPair =  new ObjectPair<Integer, byte[]>();
    objectPair.setFirst(0);
    String expr = "year>'0'";
    objectPair.setSecond(expr.getBytes());

    List<ObjectPair<Integer,byte[]>> partExprs = new ArrayList<ObjectPair<Integer,byte[]>>();

    partExprs.add(objectPair);

    client.dropPartitions(hiveDb, hiveTable, partExprs, PartitionDropOptions.instance());
  }

但我收到此错误:

MetaException(message:Index: 119, Size: 0)

我怀疑

objectPair.setFirst(0);
可能是个问题。 深入调试我发现它正在被
DropPartitionsExpr.setPartArchiveLevel(partExpr.getFirst())

使用

但是找不到任何关于

setPartArchiveLevel

的文档
java hadoop hive hive-metastore
1个回答
0
投票

预期的字节数组是 Kryo 序列化的

ExprNodeGenericFuncDesc

import org.apache.hadoop.hive.metastore.api.FieldSchema
import org.apache.hadoop.hive.ql.exec.FunctionRegistry
import org.apache.hadoop.hive.ql.exec.SerializationUtilities
import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc
import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc
import org.apache.hadoop.hive.ql.plan.ExprNodeDesc
import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo, 
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils

FieldSchema yearFieldSchema = new FieldSchema("year", "int", "");
String minYear = "2022";

PrimitiveTypeInfo intTypeInfo =
  TypeInfoFactory.getPrimitiveTypeInfo(yearFieldSchema.getType);

ObjectInspectorConverters.Converter converter = ObjectInspectorConverters.getConverter(
    TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(
        TypeInfoFactory.stringTypeInfo
    ),
    TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(
        intTypeInfo
    )
);


ExprNodeGenericFuncDesc expr = new ExprNodeGenericFuncDesc(
    TypeInfoFactory.booleanTypeInfo,
    FunctionRegistry.getFunctionInfo(">").getGenericUDF(),
    Arrays.asList(
        new ExprNodeColumnDesc(intTypeInfo, "year", null, true),
        new ExprNodeConstantDesc(intTypeInfo, converter.convert(partColumnType, minYear))
    )
);

byte[] exprBytes = SerializationUtilities.serializeExpressionToKryo(expr);
© www.soinside.com 2019 - 2024. All rights reserved.