我需要删除 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
的文档
预期的字节数组是 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);