Skip to content

Commit 3645f0d

Browse files
committed
Simplify convert util
* 현재 metastore 에 pushdown 되는 케이스가 integral value / string / date 타입 뿐이고, glue catalog는 date type도 string 형태로 받으므로 db의 파티션 키 정보 없이 단순 변환 하도록 로직을 단순화
1 parent f278973 commit 3645f0d

File tree

2 files changed

+8
-39
lines changed

2 files changed

+8
-39
lines changed

aws-glue-datacatalog-client-common/src/main/java/com/amazonaws/glue/catalog/converters/ConverterUtils.java

+7-38
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package com.amazonaws.glue.catalog.converters;
22

3-
import com.amazonaws.glue.catalog.metastore.AWSGlueClientFactory;
4-
import org.apache.commons.lang3.StringUtils;
53
import com.amazonaws.services.glue.model.Table;
6-
74
import com.google.gson.Gson;
5+
import org.apache.commons.lang3.StringUtils;
86
import org.apache.hadoop.hive.metastore.HiveMetaStore;
97
import org.apache.hadoop.hive.metastore.PartFilterExprUtil;
108
import org.apache.hadoop.hive.metastore.api.MetaException;
119
import org.apache.hadoop.hive.metastore.parser.ExpressionTree;
12-
import org.apache.hadoop.hive.serde.serdeConstants;
1310
import org.apache.log4j.Logger;
1411

1512
public class ConverterUtils {
@@ -40,22 +37,19 @@ public static String convertLocationScheme(String location, String targetScheme)
4037
public static class PartitionFilterConverter extends ExpressionTree.TreeVisitor {
4138
private static final Logger logger = Logger.getLogger(PartitionFilterConverter.class);
4239

43-
// Need to be convert to hive metastore api model
44-
private final org.apache.hadoop.hive.metastore.api.Table table;
4540
private final ExpressionTree.FilterBuilder filterBuffer;
4641

47-
private PartitionFilterConverter(Table table, String dbname) {
48-
this.table = CatalogToHiveConverter.convertTable(table, dbname);
42+
private PartitionFilterConverter() {
4943
this.filterBuffer = new ExpressionTree.FilterBuilder(false);
5044
}
5145

5246
// hive 에서 넘어온 partition filter expr을 glue catalog 맥락으로 전환
5347
// 이 과정에서 모종의 이슈가 발생 할 경우 로그로 정보만 남기고 null 리턴 (이 경우 partition pruning을 하지 않도록 fallback)
54-
public static String convertHiveToCatalog(Table table, String dbname, String filter) {
48+
public static String convertHiveToCatalog(String filter) {
5549
try {
5650
final ExpressionTree tree = (filter != null && !filter.isEmpty())
5751
? PartFilterExprUtil.getFilterParser(filter).tree : ExpressionTree.EMPTY_TREE;
58-
PartitionFilterConverter visitor = new PartitionFilterConverter(table, dbname);
52+
PartitionFilterConverter visitor = new PartitionFilterConverter();
5953
tree.accept(visitor);
6054

6155
// (kimtkyeom) TODO: Need to throw?
@@ -99,17 +93,6 @@ private static enum FilterType {
9993

10094
Invalid;
10195

102-
static FilterType fromType(String colTypeStr) {
103-
if (colTypeStr.equals(serdeConstants.STRING_TYPE_NAME)) {
104-
return FilterType.String;
105-
} else if (colTypeStr.equals(serdeConstants.DATE_TYPE_NAME)) {
106-
return FilterType.Date;
107-
} else if (serdeConstants.IntegralTypes.contains(colTypeStr)) {
108-
return FilterType.Integral;
109-
}
110-
return FilterType.Invalid;
111-
}
112-
11396
public static FilterType fromClass(Object value) {
11497
if (value instanceof String) {
11598
return FilterType.String;
@@ -124,16 +107,6 @@ public static FilterType fromClass(Object value) {
124107

125108
@Override
126109
public void visit(ExpressionTree.LeafNode node) throws MetaException {
127-
int partColIndex = node.getPartColIndexForFilter(table, filterBuffer);
128-
if (filterBuffer.hasError()) return;
129-
130-
// We skipped 'like', other ops should all work as long as the types are right.
131-
String colTypeStr = table.getPartitionKeys().get(partColIndex).getType();
132-
FilterType colType = FilterType.fromType(colTypeStr);
133-
if (colType == FilterType.Invalid) {
134-
filterBuffer.setError("Filter pushdown not supported for type " + colTypeStr);
135-
return;
136-
}
137110
FilterType valType = FilterType.fromClass(node.value);
138111
Object nodeValue = node.value;
139112
if (valType == FilterType.Invalid) {
@@ -142,15 +115,11 @@ public void visit(ExpressionTree.LeafNode node) throws MetaException {
142115
}
143116

144117
String partFilterExpr = "";
145-
if (colType == FilterType.Integral) {
118+
if (valType == FilterType.Integral) {
146119
partFilterExpr = node.keyName + node.operator.getOp() + node.value;
147-
} else if (colType == FilterType.String) {
148-
partFilterExpr = node.keyName + node.operator.getOp() + "'" + node.value + "'";
149-
} else if (colType == FilterType.Date && valType == FilterType.String) {
150-
// (kimtkyeom) directSql 로 들어오는 partition pruning expr 중 string 형태로 filter value가 들어오는 경우가 있음.
151-
// Glue는 unquoted date str을 받지 않으므로 quote를 추가해주는 대응을 한다.
120+
} else if (valType == FilterType.String) {
152121
partFilterExpr = node.keyName + node.operator.getOp() + "'" + node.value + "'";
153-
} else if (colType == FilterType.Date && valType == FilterType.Date) {
122+
} else if (valType == FilterType.Date) {
154123
// (kimtkyeom) Date type 필터가 date type value로 들어온 경우, string으로 format
155124
String dateFormatted = HiveMetaStore.PARTITION_DATE_FORMAT.get().format((java.sql.Date) nodeValue);
156125
partFilterExpr = node.keyName + node.operator.getOp() + "'" + dateFormatted + "'";

aws-glue-datacatalog-client-common/src/main/java/com/amazonaws/glue/catalog/metastore/DefaultAWSGlueMetastore.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ private List<Partition> getCatalogPartitions(String databaseName, String tableNa
316316
Table table = getTable(databaseName, tableName);
317317
String convertedExpr = ConverterUtils
318318
.PartitionFilterConverter
319-
.convertHiveToCatalog(table, databaseName, expression);
319+
.convertHiveToCatalog(expression);
320320

321321
String nextToken = null;
322322
do {

0 commit comments

Comments
 (0)