This is an automated email from the ASF dual-hosted git repository.
healchow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-inlong.git
The following commit(s) were added to refs/heads/master by this push:
new 3da64218a [INLONG-3993][Manager] Support HiveLoadNode in lightweight
mode (#4009)
3da64218a is described below
commit 3da64218aa11cac4fc0195d31b227db1a2f5ff7a
Author: kipshi <[email protected]>
AuthorDate: Thu Apr 28 21:16:32 2022 +0800
[INLONG-3993][Manager] Support HiveLoadNode in lightweight mode (#4009)
---
.../inlong/manager/client/api/sink/HiveSink.java | 12 ++-
.../client/api/util/InlongStreamSinkTransfer.java | 12 ++-
.../api/util/InlongStreamSourceTransfer.java | 98 +---------------------
.../api/util/InlongStreamTransformTransfer.java | 7 +-
.../inlong/manager/common/enums/MetaFieldType.java | 37 +++++++-
.../manager/common/pojo/sink/hive/HiveSinkDTO.java | 8 ++
.../pojo/sink/hive/HiveSinkListResponse.java | 6 ++
.../common/pojo/sink/hive/HiveSinkRequest.java | 6 ++
.../common/pojo/sink/hive/HiveSinkResponse.java | 6 ++
.../manager/common/pojo/stream/StreamField.java | 10 +++
.../common/pojo/transform/TransformRequest.java | 4 +-
.../common/pojo/transform/TransformResponse.java | 4 +-
.../manager/common/util/StreamParseUtils.java | 88 ++++++++++++++++++-
.../dao/entity/StreamTransformFieldEntity.java | 2 +
.../mappers/StreamTransformFieldEntityMapper.xml | 24 ++++--
.../service/sort/util/ExtractNodeUtils.java | 15 ++--
.../manager/service/sort/util/FieldInfoUtils.java | 25 ++++++
.../service/sort/util/FieldRelationShipUtils.java | 75 +++++++++--------
.../manager/service/sort/util/LoadNodeUtils.java | 44 ++++++++++
.../service/sort/util/TransformNodeUtils.java | 19 +----
.../transform/StreamTransformServiceImpl.java | 17 ++--
.../main/resources/sql/apache_inlong_manager.sql | 5 +-
.../manager-web/sql/apache_inlong_manager.sql | 1 +
23 files changed, 343 insertions(+), 182 deletions(-)
diff --git
a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/sink/HiveSink.java
b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/sink/HiveSink.java
index 80e7497e5..ba166ffd9 100644
---
a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/sink/HiveSink.java
+++
b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/sink/HiveSink.java
@@ -23,14 +23,14 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
-import org.apache.inlong.manager.common.enums.DataFormat;
import org.apache.inlong.manager.client.api.DataSeparator;
-import org.apache.inlong.manager.common.pojo.stream.SinkField;
-import org.apache.inlong.manager.common.pojo.stream.StreamSink;
import org.apache.inlong.manager.client.api.auth.DefaultAuthentication;
+import org.apache.inlong.manager.common.enums.DataFormat;
import org.apache.inlong.manager.common.enums.FileFormat;
import org.apache.inlong.manager.common.enums.SinkType;
import org.apache.inlong.manager.common.pojo.sink.hive.HivePartitionField;
+import org.apache.inlong.manager.common.pojo.stream.SinkField;
+import org.apache.inlong.manager.common.pojo.stream.StreamSink;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@@ -81,5 +81,11 @@ public class HiveSink extends StreamSink {
@ApiModelProperty("Data format type for stream sink")
private DataFormat dataFormat;
+
+ @ApiModelProperty("Version for hive")
+ private String hiveVersion;
+
+ @ApiModelProperty("Config directory of hive, needed by sort in light mode")
+ private String hiveConfDir;
}
diff --git
a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamSinkTransfer.java
b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamSinkTransfer.java
index fe052febc..7cf90d27b 100644
---
a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamSinkTransfer.java
+++
b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamSinkTransfer.java
@@ -20,14 +20,12 @@ package org.apache.inlong.manager.client.api.util;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.inlong.manager.common.enums.DataFormat;
import org.apache.inlong.manager.client.api.DataSeparator;
-import org.apache.inlong.manager.common.pojo.stream.SinkField;
-import org.apache.inlong.manager.common.pojo.stream.StreamSink;
import org.apache.inlong.manager.client.api.auth.DefaultAuthentication;
import org.apache.inlong.manager.client.api.sink.ClickHouseSink;
import org.apache.inlong.manager.client.api.sink.HiveSink;
import org.apache.inlong.manager.client.api.sink.KafkaSink;
+import org.apache.inlong.manager.common.enums.DataFormat;
import org.apache.inlong.manager.common.enums.FieldType;
import org.apache.inlong.manager.common.enums.FileFormat;
import org.apache.inlong.manager.common.enums.GlobalConstants;
@@ -43,6 +41,8 @@ import
org.apache.inlong.manager.common.pojo.sink.hive.HiveSinkResponse;
import org.apache.inlong.manager.common.pojo.sink.kafka.KafkaSinkRequest;
import org.apache.inlong.manager.common.pojo.sink.kafka.KafkaSinkResponse;
import org.apache.inlong.manager.common.pojo.stream.InlongStreamInfo;
+import org.apache.inlong.manager.common.pojo.stream.SinkField;
+import org.apache.inlong.manager.common.pojo.stream.StreamSink;
import org.apache.inlong.manager.common.util.CommonBeanUtils;
import java.nio.charset.Charset;
@@ -223,6 +223,8 @@ public class InlongStreamSinkTransfer {
hiveSinkRequest.setFileFormat(hiveSink.getFileFormat().name());
hiveSinkRequest.setSinkType(hiveSink.getSinkType().name());
hiveSinkRequest.setPartitionFieldList(hiveSink.getPartitionFieldList());
+ hiveSinkRequest.setHiveConfDir(hiveSink.getHiveConfDir());
+ hiveSinkRequest.setHiveVersion(hiveSink.getHiveVersion());
DefaultAuthentication defaultAuthentication =
hiveSink.getAuthentication();
AssertUtil.notNull(defaultAuthentication,
String.format("Hive storage:%s must be authenticated",
hiveSink.getDbName()));
@@ -268,6 +270,8 @@ public class InlongStreamSinkTransfer {
hiveSink.setTableName(snapshot.getTableName());
hiveSink.setDbName(snapshot.getDbName());
hiveSink.setDataPath(snapshot.getDataPath());
+ hiveSink.setHiveVersion(snapshot.getHiveVersion());
+ hiveSink.setHiveConfDir(snapshot.getHiveConfDir());
hiveSink.setPartitionFieldList(snapshot.getPartitionFieldList());
} else {
hiveSink.setSinkName(sinkResponse.getSinkName());
@@ -281,6 +285,8 @@ public class InlongStreamSinkTransfer {
hiveSink.setTableName(sinkResponse.getTableName());
hiveSink.setDbName(sinkResponse.getDbName());
hiveSink.setDataPath(sinkResponse.getDataPath());
+ hiveSink.setHiveConfDir(sinkResponse.getHiveConfDir());
+ hiveSink.setHiveVersion(sinkResponse.getHiveVersion());
hiveSink.setPartitionFieldList(sinkResponse.getPartitionFieldList());
}
diff --git
a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamSourceTransfer.java
b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamSourceTransfer.java
index dc7847fe8..af9ce5b32 100644
---
a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamSourceTransfer.java
+++
b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamSourceTransfer.java
@@ -20,33 +20,27 @@ package org.apache.inlong.manager.client.api.util;
import com.google.common.base.Joiner;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.inlong.manager.common.enums.DataFormat;
-import org.apache.inlong.manager.common.pojo.source.kafka.KafkaOffset;
-import org.apache.inlong.manager.common.pojo.stream.StreamSource;
-import org.apache.inlong.manager.common.pojo.stream.StreamSource.State;
-import org.apache.inlong.manager.common.pojo.stream.StreamSource.SyncType;
import org.apache.inlong.manager.client.api.auth.DefaultAuthentication;
import org.apache.inlong.manager.client.api.source.AgentFileSource;
import org.apache.inlong.manager.client.api.source.AutoPushSource;
import org.apache.inlong.manager.client.api.source.KafkaSource;
import org.apache.inlong.manager.client.api.source.MySQLBinlogSource;
+import org.apache.inlong.manager.common.enums.DataFormat;
import org.apache.inlong.manager.common.enums.SourceType;
-import org.apache.inlong.manager.common.pojo.source.SourceListResponse;
import org.apache.inlong.manager.common.pojo.source.SourceRequest;
import org.apache.inlong.manager.common.pojo.source.SourceResponse;
-import
org.apache.inlong.manager.common.pojo.source.autopush.AutoPushSourceListResponse;
import
org.apache.inlong.manager.common.pojo.source.autopush.AutoPushSourceRequest;
import
org.apache.inlong.manager.common.pojo.source.autopush.AutoPushSourceResponse;
-import
org.apache.inlong.manager.common.pojo.source.binlog.BinlogSourceListResponse;
import org.apache.inlong.manager.common.pojo.source.binlog.BinlogSourceRequest;
import
org.apache.inlong.manager.common.pojo.source.binlog.BinlogSourceResponse;
-import
org.apache.inlong.manager.common.pojo.source.file.FileSourceListResponse;
import org.apache.inlong.manager.common.pojo.source.file.FileSourceRequest;
import org.apache.inlong.manager.common.pojo.source.file.FileSourceResponse;
-import
org.apache.inlong.manager.common.pojo.source.kafka.KafkaSourceListResponse;
import org.apache.inlong.manager.common.pojo.source.kafka.KafkaSourceRequest;
import org.apache.inlong.manager.common.pojo.source.kafka.KafkaSourceResponse;
import org.apache.inlong.manager.common.pojo.stream.InlongStreamInfo;
+import org.apache.inlong.manager.common.pojo.stream.StreamSource;
+import org.apache.inlong.manager.common.pojo.stream.StreamSource.State;
+import org.apache.inlong.manager.common.pojo.stream.StreamSource.SyncType;
import java.util.Arrays;
@@ -89,24 +83,6 @@ public class InlongStreamSourceTransfer {
throw new IllegalArgumentException(String.format("Unsupported source
type : %s for Inlong", sourceType));
}
- public static StreamSource parseStreamSource(SourceListResponse
sourceListResponse) {
- String type = sourceListResponse.getSourceType();
- SourceType sourceType = SourceType.forType(type);
- if (sourceType == SourceType.KAFKA && sourceListResponse instanceof
KafkaSourceListResponse) {
- return parseKafkaSource((KafkaSourceListResponse)
sourceListResponse);
- }
- if (sourceType == SourceType.BINLOG && sourceListResponse instanceof
BinlogSourceListResponse) {
- return parseMySQLBinlogSource((BinlogSourceListResponse)
sourceListResponse);
- }
- if (sourceType == SourceType.FILE && sourceListResponse instanceof
FileSourceListResponse) {
- return parseAgentFileSource((FileSourceListResponse)
sourceListResponse);
- }
- if (sourceType == SourceType.AUTO_PUSH && sourceListResponse
instanceof AutoPushSourceListResponse) {
- return parseAutoPushSource((AutoPushSourceListResponse)
sourceListResponse);
- }
- throw new IllegalArgumentException(String.format("Unsupported source
type : %s for Inlong", sourceType));
- }
-
private static KafkaSource parseKafkaSource(KafkaSourceResponse response) {
KafkaSource kafkaSource = new KafkaSource();
kafkaSource.setSourceName(response.getSourceName());
@@ -129,25 +105,6 @@ public class InlongStreamSourceTransfer {
return kafkaSource;
}
- private static KafkaSource parseKafkaSource(KafkaSourceListResponse
response) {
- KafkaSource kafkaSource = new KafkaSource();
- kafkaSource.setSourceName(response.getSourceName());
- kafkaSource.setConsumerGroup(response.getGroupId());
- kafkaSource.setState(State.parseByStatus(response.getStatus()));
- DataFormat dataFormat =
DataFormat.forName(response.getSerializationType());
- kafkaSource.setDataFormat(dataFormat);
- kafkaSource.setTopic(response.getTopic());
- kafkaSource.setBootstrapServers(response.getBootstrapServers());
- kafkaSource.setByteSpeedLimit(response.getByteSpeedLimit());
-
kafkaSource.setTopicPartitionOffset(response.getTopicPartitionOffset());
-
- KafkaOffset offset =
KafkaOffset.forName(response.getAutoOffsetReset());
- kafkaSource.setAutoOffsetReset(offset);
- kafkaSource.setRecordSpeedLimit(response.getRecordSpeedLimit());
- kafkaSource.setSyncType(SyncType.FULL);
- return kafkaSource;
- }
-
private static MySQLBinlogSource
parseMySQLBinlogSource(BinlogSourceResponse response) {
MySQLBinlogSource binlogSource = new MySQLBinlogSource();
binlogSource.setSourceName(response.getSourceName());
@@ -177,33 +134,6 @@ public class InlongStreamSourceTransfer {
return binlogSource;
}
- private static MySQLBinlogSource
parseMySQLBinlogSource(BinlogSourceListResponse response) {
- MySQLBinlogSource binlogSource = new MySQLBinlogSource();
- binlogSource.setSourceName(response.getSourceName());
- binlogSource.setHostname(response.getHostname());
- binlogSource.setDataFormat(DataFormat.NONE);
- binlogSource.setPort(response.getPort());
- binlogSource.setState(State.parseByStatus(response.getStatus()));
- binlogSource.setServerId(response.getServerId());
- DefaultAuthentication defaultAuthentication = new
DefaultAuthentication(
- response.getUser(),
- response.getPassword());
- binlogSource.setAuthentication(defaultAuthentication);
- binlogSource.setIncludeSchema(response.getIncludeSchema());
- binlogSource.setServerTimezone(response.getServerTimezone());
- binlogSource.setMonitoredDdl(response.getMonitoredDdl());
-
binlogSource.setTimestampFormatStandard(response.getTimestampFormatStandard());
- binlogSource.setAllMigration(response.isAllMigration());
- binlogSource.setPrimaryKey(response.getPrimaryKey());
- if (StringUtils.isNotBlank(response.getDatabaseWhiteList())) {
-
binlogSource.setDbNames(Arrays.asList(response.getDatabaseWhiteList().split(",")));
- }
- if (StringUtils.isNotBlank(response.getTableWhiteList())) {
-
binlogSource.setTableNames(Arrays.asList(response.getTableWhiteList().split(",")));
- }
- return binlogSource;
- }
-
private static AgentFileSource parseAgentFileSource(FileSourceResponse
response) {
AgentFileSource fileSource = new AgentFileSource();
fileSource.setSourceName(response.getSourceName());
@@ -216,17 +146,6 @@ public class InlongStreamSourceTransfer {
return fileSource;
}
- private static AgentFileSource parseAgentFileSource(FileSourceListResponse
response) {
- AgentFileSource fileSource = new AgentFileSource();
- fileSource.setSourceName(response.getSourceName());
- fileSource.setState(State.parseByStatus(response.getStatus()));
- fileSource.setDataFormat(DataFormat.NONE);
- fileSource.setPattern(response.getPattern());
- fileSource.setIp(response.getIp());
- fileSource.setTimeOffset(response.getTimeOffset());
- return fileSource;
- }
-
private static AutoPushSource parseAutoPushSource(AutoPushSourceResponse
response) {
AutoPushSource autoPushSource = new AutoPushSource();
autoPushSource.setSourceName(response.getSourceName());
@@ -237,15 +156,6 @@ public class InlongStreamSourceTransfer {
return autoPushSource;
}
- private static AutoPushSource
parseAutoPushSource(AutoPushSourceListResponse response) {
- AutoPushSource autoPushSource = new AutoPushSource();
- autoPushSource.setSourceName(response.getSourceName());
- autoPushSource.setState(State.parseByStatus(response.getStatus()));
- autoPushSource.setDataFormat(DataFormat.NONE);
- autoPushSource.setDataProxyGroup(response.getDataProxyGroup());
- return autoPushSource;
- }
-
private static KafkaSourceRequest createKafkaSourceRequest(KafkaSource
kafkaSource, InlongStreamInfo streamInfo) {
KafkaSourceRequest sourceRequest = new KafkaSourceRequest();
sourceRequest.setSourceName(kafkaSource.getSourceName());
diff --git
a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamTransformTransfer.java
b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamTransformTransfer.java
index aa9c20776..2e606da24 100644
---
a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamTransformTransfer.java
+++
b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/util/InlongStreamTransformTransfer.java
@@ -22,11 +22,11 @@ import com.google.common.base.Splitter;
import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.inlong.manager.common.pojo.stream.StreamTransform;
import org.apache.inlong.manager.client.api.transform.MultiDependencyTransform;
import
org.apache.inlong.manager.client.api.transform.SingleDependencyTransform;
import org.apache.inlong.manager.common.enums.TransformType;
import org.apache.inlong.manager.common.pojo.stream.InlongStreamInfo;
+import org.apache.inlong.manager.common.pojo.stream.StreamTransform;
import org.apache.inlong.manager.common.pojo.transform.TransformDefinition;
import org.apache.inlong.manager.common.pojo.transform.TransformRequest;
import org.apache.inlong.manager.common.pojo.transform.TransformResponse;
@@ -56,8 +56,7 @@ public class InlongStreamTransformTransfer {
transformRequest.setPostNodeNames(Joiner.on(",").join(streamTransform.getPostNodes()));
}
if (CollectionUtils.isNotEmpty(streamTransform.getFields())) {
- transformRequest.setFieldList(
-
InlongStreamTransfer.createStreamFields(streamTransform.getFields(),
streamInfo));
+ transformRequest.setFieldList(streamTransform.getFields());
}
return transformRequest;
}
@@ -84,7 +83,7 @@ public class InlongStreamTransformTransfer {
streamTransform.setPostNodes(Sets.newHashSet(postNodes));
}
if (CollectionUtils.isNotEmpty(transformResponse.getFieldList())) {
-
streamTransform.setFields(InlongStreamTransfer.parseStreamFields(transformResponse.getFieldList()));
+ streamTransform.setFields(transformResponse.getFieldList());
}
return streamTransform;
}
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/MetaFieldType.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/MetaFieldType.java
index c440d1f26..6e9d8f49f 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/MetaFieldType.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/MetaFieldType.java
@@ -55,7 +55,42 @@ public enum MetaFieldType {
/**
* event_type
*/
- EVENT_TYPE("event_type", "meta field event_type used in canal json or
mysql binlong and so on");
+ EVENT_TYPE("event_type", "meta field event_type used in canal json or
mysql binlong and so on"),
+
+ /**
+ * data
+ */
+ MYSQL_DATA("data", "MySQL binlog data Row"),
+
+ /**
+ * update_before
+ */
+ UPDATE_BEFORE("update_before", "The value of the field before update"),
+
+ /**
+ * Batch id of binlog
+ */
+ BATCH_ID("batch_id", "Batch id of binlog"),
+
+ /**
+ * sql_type
+ */
+ SQL_TYPE("sql_type", "Mapping of sql_type table fields to java data type
IDs"),
+
+ /**
+ * ts
+ */
+ TS("ts", "The current time when the ROW was received and processed"),
+
+ /**
+ * mysql_type
+ */
+ MYSQL_TYPE("mysql_type", "The table structure"),
+
+ /**
+ * pk_names
+ */
+ PK_NAMES("pk_names", "Primary key field name");
private final String name;
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkDTO.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkDTO.java
index 44eea624f..7c3ea4df3 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkDTO.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkDTO.java
@@ -81,6 +81,12 @@ public class HiveSinkDTO {
@ApiModelProperty("Properties for hive")
private Map<String, Object> properties;
+ @ApiModelProperty("Version for hive")
+ private String hiveVersion;
+
+ @ApiModelProperty("Config directory of hive, needed by sort in light mode")
+ private String hiveConfDir;
+
/**
* Get the dto instance from the request
*/
@@ -98,6 +104,8 @@ public class HiveSinkDTO {
.fileFormat(request.getFileFormat())
.dataEncoding(request.getDataEncoding())
.dataSeparator(request.getDataSeparator())
+ .hiveVersion(request.getHiveVersion())
+ .hiveConfDir(request.getHiveConfDir())
.properties(request.getProperties())
.build();
}
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkListResponse.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkListResponse.java
index a6c98c193..ff26a353d 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkListResponse.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkListResponse.java
@@ -49,4 +49,10 @@ public class HiveSinkListResponse extends SinkListResponse {
@ApiModelProperty("partition type, like: H-hour, D-day, W-week, M-month,
O-once, R-regulation")
private String partitionType;
+ @ApiModelProperty("Version for hive")
+ private String hiveVersion;
+
+ @ApiModelProperty("Config directory of hive, needed by sort in light mode")
+ private String hiveConfDir;
+
}
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkRequest.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkRequest.java
index 80d8dc52b..c098bee96 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkRequest.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkRequest.java
@@ -77,4 +77,10 @@ public class HiveSinkRequest extends SinkRequest {
@ApiModelProperty("Data field separator")
private String dataSeparator;
+ @ApiModelProperty("Version for hive")
+ private String hiveVersion;
+
+ @ApiModelProperty("Config directory of hive, needed by sort in light mode")
+ private String hiveConfDir;
+
}
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkResponse.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkResponse.java
index d055c3bf4..659ebf167 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkResponse.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/sink/hive/HiveSinkResponse.java
@@ -72,6 +72,12 @@ public class HiveSinkResponse extends SinkResponse {
@ApiModelProperty("Data field separator")
private String dataSeparator;
+ @ApiModelProperty("Version for hive")
+ private String hiveVersion;
+
+ @ApiModelProperty("Config directory of hive, needed by sort in light mode")
+ private String hiveConfDir;
+
public HiveSinkResponse() {
this.sinkType = SinkType.SINK_HIVE;
}
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/stream/StreamField.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/stream/StreamField.java
index 1b1fc525c..e2e4b1efc 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/stream/StreamField.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/stream/StreamField.java
@@ -49,6 +49,13 @@ public class StreamField {
this.isMetaField = isMetaField;
}
+ public StreamField(int index, FieldType fieldType, String fieldName,
String fieldComment, String fieldValue,
+ Integer isMetaField, String originNodeName) {
+ this(index, fieldType, fieldName, fieldComment, fieldValue);
+ this.isMetaField = isMetaField;
+ this.originNodeName = originNodeName;
+ }
+
@ApiModelProperty("Field index")
private Integer id;
@@ -71,4 +78,7 @@ public class StreamField {
+ " and custom such as 'yyyy-MM-dd HH:mm:ss'. This is mainly used
for time format")
private String fieldFormat;
+ @ApiModelProperty("Origin Node name which stream field belongs")
+ private String originNodeName;
+
}
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/transform/TransformRequest.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/transform/TransformRequest.java
index 861979434..caf3267f5 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/transform/TransformRequest.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/transform/TransformRequest.java
@@ -20,7 +20,7 @@ package org.apache.inlong.manager.common.pojo.transform;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import org.apache.inlong.manager.common.pojo.stream.InlongStreamFieldInfo;
+import org.apache.inlong.manager.common.pojo.stream.StreamField;
import javax.validation.constraints.NotNull;
import java.util.List;
@@ -66,6 +66,6 @@ public class TransformRequest {
private Integer version;
@ApiModelProperty(value = "Field list")
- private List<InlongStreamFieldInfo> fieldList;
+ private List<StreamField> fieldList;
}
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/transform/TransformResponse.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/transform/TransformResponse.java
index 63c314a83..3467675af 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/transform/TransformResponse.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/transform/TransformResponse.java
@@ -21,7 +21,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.compress.utils.Lists;
-import org.apache.inlong.manager.common.pojo.stream.InlongStreamFieldInfo;
+import org.apache.inlong.manager.common.pojo.stream.StreamField;
import java.util.List;
@@ -59,5 +59,5 @@ public class TransformResponse {
private Integer version;
@ApiModelProperty(value = "Field list")
- private List<InlongStreamFieldInfo> fieldList = Lists.newArrayList();
+ private List<StreamField> fieldList = Lists.newArrayList();
}
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/util/StreamParseUtils.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/util/StreamParseUtils.java
index ad81da958..c3fc2a0d5 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/util/StreamParseUtils.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/util/StreamParseUtils.java
@@ -18,8 +18,17 @@
package org.apache.inlong.manager.common.util;
import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import org.apache.inlong.manager.common.enums.DataFormat;
+import org.apache.inlong.manager.common.enums.SinkType;
+import org.apache.inlong.manager.common.enums.SourceType;
import org.apache.inlong.manager.common.enums.TransformType;
+import org.apache.inlong.manager.common.pojo.stream.SinkField;
+import org.apache.inlong.manager.common.pojo.stream.StreamNode;
import org.apache.inlong.manager.common.pojo.stream.StreamPipeline;
+import org.apache.inlong.manager.common.pojo.stream.StreamSink;
+import org.apache.inlong.manager.common.pojo.stream.StreamSource;
+import org.apache.inlong.manager.common.pojo.stream.StreamTransform;
import org.apache.inlong.manager.common.pojo.transform.TransformDefinition;
import
org.apache.inlong.manager.common.pojo.transform.deduplication.DeDuplicationDefinition;
import org.apache.inlong.manager.common.pojo.transform.filter.FilterDefinition;
@@ -27,8 +36,19 @@ import
org.apache.inlong.manager.common.pojo.transform.joiner.JoinerDefinition;
import
org.apache.inlong.manager.common.pojo.transform.replacer.StringReplacerDefinition;
import
org.apache.inlong.manager.common.pojo.transform.splitter.SplitterDefinition;
+import java.util.List;
+
public class StreamParseUtils {
+ public static final String LEFT_NODE = "leftNode";
+ public static final String RIGHT_NODE = "rightNode";
+ public static final String SOURCE_TYPE = "sourceType";
+ public static final String SOURCE_NAME = "sourceName";
+ public static final String SINK_TYPE = "sinkType";
+ public static final String SINK_NAME = "sinkName";
+ public static final String TRANSFORM_TYPE = "transformType";
+ public static final String TRANSFORM_NAME = "transformName";
+
private static Gson gson = new Gson();
public static TransformDefinition parseTransformDefinition(String
transformDefinition,
@@ -37,7 +57,7 @@ public class StreamParseUtils {
case FILTER:
return gson.fromJson(transformDefinition,
FilterDefinition.class);
case JOINER:
- return gson.fromJson(transformDefinition,
JoinerDefinition.class);
+ return parseJoinerDefinition(transformDefinition);
case SPLITTER:
return gson.fromJson(transformDefinition,
SplitterDefinition.class);
case DE_DUPLICATION:
@@ -49,6 +69,72 @@ public class StreamParseUtils {
}
}
+ public static JoinerDefinition parseJoinerDefinition(String
transformDefinition) {
+ JoinerDefinition joinerDefinition = gson.fromJson(transformDefinition,
JoinerDefinition.class);
+ JsonObject joinerJson = gson.fromJson(transformDefinition,
JsonObject.class);
+ JsonObject leftNode = joinerJson.getAsJsonObject(LEFT_NODE);
+ StreamNode leftStreamNode = parseNode(leftNode);
+ joinerDefinition.setLeftNode(leftStreamNode);
+ JsonObject rightNode = joinerJson.getAsJsonObject("rightNode");
+ StreamNode rightStreamNode = parseNode(rightNode);
+ joinerDefinition.setRightNode(rightStreamNode);
+ return joinerDefinition;
+ }
+
+ private static StreamNode parseNode(JsonObject jsonObject) {
+ if (jsonObject.has(SOURCE_TYPE)) {
+ String sourceName = jsonObject.get(SOURCE_NAME).getAsString();
+ StreamSource source = new StreamSource() {
+ @Override
+ public SourceType getSourceType() {
+ return null;
+ }
+
+ @Override
+ public SyncType getSyncType() {
+ return null;
+ }
+
+ @Override
+ public DataFormat getDataFormat() {
+ return null;
+ }
+ };
+ source.setSourceName(sourceName);
+ return source;
+ } else if (jsonObject.has(SINK_TYPE)) {
+ String sinkName = jsonObject.get(SINK_NAME).getAsString();
+ StreamSink sink = new StreamSink() {
+ @Override
+ public SinkType getSinkType() {
+ return null;
+ }
+
+ @Override
+ public List<SinkField> getSinkFields() {
+ return null;
+ }
+
+ @Override
+ public DataFormat getDataFormat() {
+ return null;
+ }
+ };
+ sink.setSinkName(sinkName);
+ return sink;
+ } else {
+ String transformName =
jsonObject.get(TRANSFORM_NAME).getAsString();
+ StreamTransform transform = new StreamTransform() {
+ @Override
+ public String getTransformName() {
+ return super.getTransformName();
+ }
+ };
+ transform.setTransformName(transformName);
+ return transform;
+ }
+ }
+
public static StreamPipeline parseStreamPipeline(String tempView, String
inlongStreamId) {
Preconditions.checkNotEmpty(tempView,
String.format(" should not be null for streamId=%s",
inlongStreamId));
diff --git
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/StreamTransformFieldEntity.java
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/StreamTransformFieldEntity.java
index 8be669cc0..9fe374b15 100644
---
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/StreamTransformFieldEntity.java
+++
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/StreamTransformFieldEntity.java
@@ -51,4 +51,6 @@ public class StreamTransformFieldEntity implements
Serializable {
private Short rankNum;
private Integer isDeleted;
+
+ private String originNodeName;
}
\ No newline at end of file
diff --git
a/inlong-manager/manager-dao/src/main/resources/mappers/StreamTransformFieldEntityMapper.xml
b/inlong-manager/manager-dao/src/main/resources/mappers/StreamTransformFieldEntityMapper.xml
index 7e058bc68..c0e8fff14 100644
---
a/inlong-manager/manager-dao/src/main/resources/mappers/StreamTransformFieldEntityMapper.xml
+++
b/inlong-manager/manager-dao/src/main/resources/mappers/StreamTransformFieldEntityMapper.xml
@@ -35,12 +35,13 @@
<result column="field_format" jdbcType="VARCHAR"
property="fieldFormat"/>
<result column="rank_num" jdbcType="SMALLINT" property="rankNum"/>
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted"/>
+ <result column="origin_node_name" jdbcType="VARCHAR"
property="originNodeName"/>
</resultMap>
<sql id="Base_Column_List">
id
, inlong_group_id, inlong_stream_id, transform_id, transform_type,
field_name,
field_value, pre_expression, field_type, field_comment, is_meta_field,
field_format,
- rank_num, is_deleted
+ rank_num, is_deleted, origin_node_name
</sql>
<select id="selectByTransformId"
resultType="org.apache.inlong.manager.dao.entity.StreamTransformFieldEntity">
select
@@ -76,12 +77,12 @@
transform_id, transform_type,
field_name,
field_value, pre_expression,
field_type,
field_comment, is_meta_field,
field_format,
- rank_num, is_deleted)
+ rank_num, is_deleted,
origin_node_name)
values (#{id,jdbcType=INTEGER}, #{inlongGroupId,jdbcType=VARCHAR},
#{inlongStreamId,jdbcType=VARCHAR},
#{transformId,jdbcType=INTEGER},
#{transformType,jdbcType=VARCHAR}, #{fieldName,jdbcType=VARCHAR},
#{fieldValue,jdbcType=VARCHAR},
#{preExpression,jdbcType=VARCHAR}, #{fieldType,jdbcType=VARCHAR},
#{fieldComment,jdbcType=VARCHAR},
#{isMetaField,jdbcType=SMALLINT}, #{fieldFormat,jdbcType=VARCHAR},
- #{rankNum,jdbcType=SMALLINT}, #{isDeleted,jdbcType=INTEGER})
+ #{rankNum,jdbcType=SMALLINT}, #{isDeleted,jdbcType=INTEGER},
#{originNodeName,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" useGeneratedKeys="true" keyProperty="id"
parameterType="org.apache.inlong.manager.dao.entity.StreamTransformFieldEntity">
@@ -129,6 +130,9 @@
<if test="isDeleted != null">
is_deleted,
</if>
+ <if test="originNodeName != null">
+ origin_node_name,
+ </if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@@ -173,6 +177,9 @@
<if test="isDeleted != null">
#{isDeleted,jdbcType=INTEGER},
</if>
+ <if test="originNodeName != null">
+ #{originNodeName,jdbcType=VARCHAR},
+ </if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective"
@@ -218,6 +225,9 @@
<if test="isDeleted != null">
is_deleted = #{isDeleted,jdbcType=INTEGER},
</if>
+ <if test="originNodeName != null">
+ origin_node_name = #{originNodeName,jdbcType=VARCHAR},
+ </if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
@@ -235,7 +245,8 @@
is_meta_field = #{isMetaField,jdbcType=SMALLINT},
field_format = #{fieldFormat,jdbcType=VARCHAR},
rank_num = #{rankNum,jdbcType=SMALLINT},
- is_deleted = #{isDeleted,jdbcType=INTEGER}
+ is_deleted = #{isDeleted,jdbcType=INTEGER},
+ origin_node_name = #{originNodeName,jdbcType=VARCHAR}
where id = #{id,jdbcType=INTEGER}
</update>
@@ -244,7 +255,7 @@
transform_id, transform_type, field_name,
field_value, pre_expression, field_type,
field_comment, is_meta_field, field_format,
- rank_num, is_deleted)
+ rank_num, is_deleted, origin_node_name)
values
<foreach collection="list" index="index" item="item" separator=",">
(#{item.id,jdbcType=INTEGER},
#{item.inlongGroupId,jdbcType=VARCHAR},
@@ -255,7 +266,8 @@
#{item.fieldType,jdbcType=VARCHAR},
#{item.fieldComment,jdbcType=VARCHAR},
#{item.isMetaField,jdbcType=SMALLINT},
#{item.fieldFormat,jdbcType=VARCHAR},
- #{item.rankNum,jdbcType=SMALLINT},
#{item.isDeleted,jdbcType=INTEGER})
+ #{item.rankNum,jdbcType=SMALLINT},
#{item.isDeleted,jdbcType=INTEGER},
+ #{item.originNodeName,jdbcType=VARCHAR})
</foreach>
</insert>
diff --git
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/ExtractNodeUtils.java
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/ExtractNodeUtils.java
index 817381f34..5f4681c3d 100644
---
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/ExtractNodeUtils.java
+++
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/ExtractNodeUtils.java
@@ -20,8 +20,6 @@ package org.apache.inlong.manager.service.sort.util;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import java.util.List;
-import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.inlong.common.enums.DataTypeEnum;
@@ -43,6 +41,9 @@ import
org.apache.inlong.sort.protocol.node.format.DebeziumJsonFormat;
import org.apache.inlong.sort.protocol.node.format.Format;
import org.apache.inlong.sort.protocol.node.format.JsonFormat;
+import java.util.List;
+import java.util.stream.Collectors;
+
/**
* Parse SourceResponse to ExtractNode which sort needed
*/
@@ -93,9 +94,8 @@ public class ExtractNodeUtils {
List<String> tableNames = Splitter.on(",").splitToList(tables);
List<InlongStreamFieldInfo> streamFieldInfos =
binlogSourceResponse.getFieldList();
List<FieldInfo> fieldInfos = streamFieldInfos.stream()
- .map(streamFieldInfo -> new
FieldInfo(streamFieldInfo.getFieldName(), name,
-
FieldInfoUtils.convertFieldFormat(streamFieldInfo.getFieldType(),
-
streamFieldInfo.getFieldFormat()))).collect(Collectors.toList());
+ .map(streamFieldInfo ->
FieldInfoUtils.parseStreamFieldInfo(streamFieldInfo, name))
+ .collect(Collectors.toList());
String serverTimeZone = binlogSourceResponse.getServerTimezone();
return new MySqlExtractNode(id,
name,
@@ -125,9 +125,8 @@ public class ExtractNodeUtils {
String name = kafkaSourceResponse.getSourceName();
List<InlongStreamFieldInfo> streamFieldInfos =
kafkaSourceResponse.getFieldList();
List<FieldInfo> fieldInfos = streamFieldInfos.stream()
- .map(streamFieldInfo -> new
FieldInfo(streamFieldInfo.getFieldName(), name,
-
FieldInfoUtils.convertFieldFormat(streamFieldInfo.getFieldType(),
-
streamFieldInfo.getFieldFormat()))).collect(Collectors.toList());
+ .map(streamFieldInfo ->
FieldInfoUtils.parseStreamFieldInfo(streamFieldInfo, name))
+ .collect(Collectors.toList());
String topic = kafkaSourceResponse.getTopic();
String bootstrapServers = kafkaSourceResponse.getBootstrapServers();
Format format = null;
diff --git
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/FieldInfoUtils.java
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/FieldInfoUtils.java
index 37068228b..eb5ead03a 100644
---
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/FieldInfoUtils.java
+++
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/FieldInfoUtils.java
@@ -22,6 +22,7 @@ import org.apache.inlong.manager.common.enums.FieldType;
import org.apache.inlong.manager.common.enums.MetaFieldType;
import org.apache.inlong.manager.common.pojo.sink.SinkFieldResponse;
import org.apache.inlong.manager.common.pojo.stream.InlongStreamFieldInfo;
+import org.apache.inlong.manager.common.pojo.stream.StreamField;
import org.apache.inlong.sort.formats.common.ArrayFormatInfo;
import org.apache.inlong.sort.formats.common.BooleanFormatInfo;
import org.apache.inlong.sort.formats.common.ByteFormatInfo;
@@ -64,6 +65,30 @@ public class FieldInfoUtils {
BUILT_IN_FIELD_MAP.put(MetaFieldType.EVENT_TIME.getName(),
BuiltInField.MYSQL_METADATA_EVENT_TIME);
BUILT_IN_FIELD_MAP.put(MetaFieldType.IS_DDL.getName(),
BuiltInField.MYSQL_METADATA_IS_DDL);
BUILT_IN_FIELD_MAP.put(MetaFieldType.EVENT_TYPE.getName(),
BuiltInField.MYSQL_METADATA_EVENT_TYPE);
+ BUILT_IN_FIELD_MAP.put(MetaFieldType.PROCESSING_TIME.getName(),
BuiltInField.PROCESS_TIME);
+ BUILT_IN_FIELD_MAP.put(MetaFieldType.MYSQL_DATA.getName(),
BuiltInField.MYSQL_METADATA_DATA);
+ BUILT_IN_FIELD_MAP.put(MetaFieldType.UPDATE_BEFORE.getName(),
BuiltInField.METADATA_UPDATE_BEFORE);
+ BUILT_IN_FIELD_MAP.put(MetaFieldType.BATCH_ID.getName(),
BuiltInField.METADATA_BATCH_ID);
+ BUILT_IN_FIELD_MAP.put(MetaFieldType.SQL_TYPE.getName(),
BuiltInField.METADATA_SQL_TYPE);
+ BUILT_IN_FIELD_MAP.put(MetaFieldType.TS.getName(),
BuiltInField.METADATA_TS);
+ BUILT_IN_FIELD_MAP.put(MetaFieldType.MYSQL_TYPE.getName(),
BuiltInField.METADATA_MYSQL_TYPE);
+ BUILT_IN_FIELD_MAP.put(MetaFieldType.PK_NAMES.getName(),
BuiltInField.METADATA_PK_NAMES);
+ }
+
+ public static FieldInfo parseStreamFieldInfo(InlongStreamFieldInfo
streamField, String name) {
+ boolean isBuiltIn = streamField.getIsMetaField() == 1;
+ FieldInfo fieldInfo = getFieldInfo(streamField.getFieldName(),
streamField.getFieldType(), isBuiltIn,
+ streamField.getFieldFormat());
+ fieldInfo.setNodeId(name);
+ return fieldInfo;
+ }
+
+ public static FieldInfo parseStreamField(StreamField streamField) {
+ boolean isBuiltIn = streamField.getIsMetaField() == 1;
+ FieldInfo fieldInfo = getFieldInfo(streamField.getFieldName(),
streamField.getFieldType().toString(), isBuiltIn,
+ streamField.getFieldFormat());
+ fieldInfo.setNodeId(streamField.getOriginNodeName());
+ return fieldInfo;
}
/**
diff --git
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/FieldRelationShipUtils.java
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/FieldRelationShipUtils.java
index bef4df867..10a9bd361 100644
---
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/FieldRelationShipUtils.java
+++
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/FieldRelationShipUtils.java
@@ -19,8 +19,8 @@ package org.apache.inlong.manager.service.sort.util;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
+import org.apache.inlong.manager.common.enums.FieldType;
import org.apache.inlong.manager.common.enums.TransformType;
-import org.apache.inlong.manager.common.pojo.stream.InlongStreamFieldInfo;
import org.apache.inlong.manager.common.pojo.stream.StreamField;
import org.apache.inlong.manager.common.pojo.transform.TransformDefinition;
import org.apache.inlong.manager.common.pojo.transform.TransformResponse;
@@ -29,6 +29,7 @@ import
org.apache.inlong.manager.common.pojo.transform.replacer.StringReplacerDe
import
org.apache.inlong.manager.common.pojo.transform.replacer.StringReplacerDefinition.ReplaceRule;
import
org.apache.inlong.manager.common.pojo.transform.splitter.SplitterDefinition;
import
org.apache.inlong.manager.common.pojo.transform.splitter.SplitterDefinition.SplitRule;
+import org.apache.inlong.manager.common.util.Preconditions;
import org.apache.inlong.manager.common.util.StreamParseUtils;
import org.apache.inlong.sort.protocol.FieldInfo;
import org.apache.inlong.sort.protocol.transformation.ConstantParam;
@@ -48,60 +49,67 @@ public class FieldRelationShipUtils {
TransformType transformType =
TransformType.forType(transformResponse.getTransformType());
TransformDefinition transformDefinition =
StreamParseUtils.parseTransformDefinition(
transformResponse.getTransformDefinition(), transformType);
- List<InlongStreamFieldInfo> fieldList =
transformResponse.getFieldList();
+ List<StreamField> fieldList = transformResponse.getFieldList();
String transformName = transformResponse.getTransformName();
+ String preNodes = transformResponse.getPreNodeNames();
switch (transformType) {
case SPLITTER:
SplitterDefinition splitterDefinition = (SplitterDefinition)
transformDefinition;
- return createFieldRelationShips(fieldList, transformName,
splitterDefinition);
+ return createSplitterFieldRelationShips(fieldList,
transformName, splitterDefinition, preNodes);
+ case STRING_REPLACER:
+ StringReplacerDefinition replacerDefinition =
(StringReplacerDefinition) transformDefinition;
+ return createReplacerFieldRelationShips(fieldList,
transformName, replacerDefinition, preNodes);
case DE_DUPLICATION:
- case JOINER:
case FILTER:
+ case JOINER:
return createFieldRelationShips(fieldList, transformName);
- case STRING_REPLACER:
- StringReplacerDefinition replacerDefinition =
(StringReplacerDefinition) transformDefinition;
- return createFieldRelationShips(fieldList, transformName,
replacerDefinition);
default:
throw new UnsupportedOperationException(
String.format("Unsupported transformType=%s for
Inlong", transformType));
}
}
- private static List<FieldRelationShip>
createFieldRelationShips(List<InlongStreamFieldInfo> fieldList,
- String transformName) {
- return fieldList.stream().map(streamFieldInfo ->
- new FieldInfo(streamFieldInfo.getFieldName(),
transformName,
-
FieldInfoUtils.convertFieldFormat(streamFieldInfo.getFieldType(),
- streamFieldInfo.getFieldFormat())))
- .map(fieldInfo -> new FieldRelationShip(fieldInfo, fieldInfo))
- .collect(Collectors.toList());
+ private static List<FieldRelationShip>
createFieldRelationShips(List<StreamField> fieldList, String transformName) {
+ return fieldList.stream()
+ .map(streamFieldInfo ->
FieldInfoUtils.parseStreamField(streamFieldInfo))
+ .map(fieldInfo -> {
+ FieldInfo inputField = new FieldInfo(fieldInfo.getName(),
fieldInfo.getNodeId(),
+ fieldInfo.getFormatInfo());
+ FieldInfo outputField = new FieldInfo(fieldInfo.getName(),
transformName,
+ fieldInfo.getFormatInfo());
+ return new FieldRelationShip(inputField, outputField);
+ }).collect(Collectors.toList());
}
- private static List<FieldRelationShip>
createFieldRelationShips(List<InlongStreamFieldInfo> fieldList,
- String transformName, SplitterDefinition splitterDefinition) {
+ private static List<FieldRelationShip>
createSplitterFieldRelationShips(List<StreamField> fieldList,
+ String transformName, SplitterDefinition splitterDefinition,
String preNodes) {
+ Preconditions.checkNotEmpty(preNodes, "PreNodes of splitter should not
be null");
+ String preNode = preNodes.split(",")[0];
List<SplitRule> splitRules = splitterDefinition.getSplitRules();
Set<String> splitFields = Sets.newHashSet();
List<FieldRelationShip> fieldRelationShips = splitRules.stream()
- .map(splitRule -> parseSplitRule(splitRule, splitFields,
transformName))
+ .map(splitRule -> parseSplitRule(splitRule, splitFields,
transformName, preNode))
.reduce(Lists.newArrayList(), (list1, list2) -> {
list1.addAll(list2);
return list1;
});
- List<InlongStreamFieldInfo> filteredFieldList = fieldList.stream()
+ List<StreamField> filteredFieldList = fieldList.stream()
.filter(streamFieldInfo ->
splitFields.contains(streamFieldInfo.getFieldName()))
.collect(Collectors.toList());
fieldRelationShips.addAll(createFieldRelationShips(filteredFieldList,
transformName));
return fieldRelationShips;
}
- private static List<FieldRelationShip>
createFieldRelationShips(List<InlongStreamFieldInfo> fieldList,
- String transformName, StringReplacerDefinition replacerDefinition)
{
+ private static List<FieldRelationShip>
createReplacerFieldRelationShips(List<StreamField> fieldList,
+ String transformName, StringReplacerDefinition replacerDefinition,
String preNodes) {
+ Preconditions.checkNotEmpty(preNodes, "PreNodes of splitter should not
be null");
+ String preNode = preNodes.split(",")[0];
List<ReplaceRule> replaceRules = replacerDefinition.getReplaceRules();
Set<String> replaceFields = Sets.newHashSet();
List<FieldRelationShip> fieldRelationShips = replaceRules.stream()
- .map(replaceRule -> parseReplaceRule(replaceRule,
replaceFields, transformName))
+ .map(replaceRule -> parseReplaceRule(replaceRule,
replaceFields, transformName, preNode))
.collect(Collectors.toList());
- List<InlongStreamFieldInfo> filteredFieldList = fieldList.stream()
+ List<StreamField> filteredFieldList = fieldList.stream()
.filter(streamFieldInfo ->
replaceFields.contains(streamFieldInfo.getFieldName()))
.collect(Collectors.toList());
fieldRelationShips.addAll(createFieldRelationShips(filteredFieldList,
transformName));
@@ -109,15 +117,17 @@ public class FieldRelationShipUtils {
}
private static FieldRelationShip parseReplaceRule(ReplaceRule replaceRule,
Set<String> replaceFields,
- String transformName) {
+ String transformName, String preNode) {
StreamField sourceField = replaceRule.getSourceField();
+ final String fieldName = sourceField.getFieldName();
String regex = replaceRule.getRegex();
String targetValue = replaceRule.getTargetValue();
ReplaceMode replaceMode = replaceRule.getMode();
- FieldInfo fieldInfo = new FieldInfo(sourceField.getFieldName(),
transformName,
-
FieldInfoUtils.convertFieldFormat(sourceField.getFieldType().name(),
sourceField.getFieldFormat()));
- FieldInfo targetFieldInfo = new FieldInfo(sourceField.getFieldName(),
transformName,
-
FieldInfoUtils.convertFieldFormat(sourceField.getFieldType().name(),
sourceField.getFieldFormat()));
+ FieldInfo fieldInfo = FieldInfoUtils.parseStreamField(sourceField);
+ fieldInfo.setNodeId(preNode);
+ FieldInfo targetFieldInfo = new FieldInfo(fieldName, transformName,
+ FieldInfoUtils.convertFieldFormat(FieldType.STRING.name()));
+ replaceFields.add(fieldName);
if (replaceMode == ReplaceMode.RELACE_ALL) {
RegexpReplaceFunction regexpReplaceFunction = new
RegexpReplaceFunction(fieldInfo,
new StringConstantParam(regex), new
StringConstantParam(targetValue));
@@ -130,11 +140,11 @@ public class FieldRelationShipUtils {
}
private static List<FieldRelationShip> parseSplitRule(SplitRule splitRule,
Set<String> splitFields,
- String transformName) {
+ String transformName, String preNode) {
StreamField sourceField = splitRule.getSourceField();
splitFields.add(sourceField.getFieldName());
- FieldInfo fieldInfo = new FieldInfo(sourceField.getFieldName(),
transformName,
-
FieldInfoUtils.convertFieldFormat(sourceField.getFieldType().name(),
sourceField.getFieldFormat()));
+ FieldInfo fieldInfo = FieldInfoUtils.parseStreamField(sourceField);
+ fieldInfo.setNodeId(preNode);
String seperator = splitRule.getSeperator();
List<String> targetSources = splitRule.getTargetFields();
List<FieldRelationShip> splitRelationShips = Lists.newArrayList();
@@ -142,11 +152,10 @@ public class FieldRelationShipUtils {
SplitIndexFunction splitIndexFunction = new SplitIndexFunction(
fieldInfo, new StringConstantParam(seperator), new
ConstantParam(index));
FieldInfo targetFieldInfo = new FieldInfo(
- targetSources.get(index), transformName,
FieldInfoUtils.convertFieldFormat("STRING")
+ targetSources.get(index), transformName,
FieldInfoUtils.convertFieldFormat(FieldType.STRING.name())
);
splitRelationShips.add(new FieldRelationShip(splitIndexFunction,
targetFieldInfo));
}
return splitRelationShips;
}
-
}
diff --git
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/LoadNodeUtils.java
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/LoadNodeUtils.java
index 928e701ce..4e1080b8b 100644
---
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/LoadNodeUtils.java
+++
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/LoadNodeUtils.java
@@ -24,6 +24,7 @@ import org.apache.inlong.common.enums.DataTypeEnum;
import org.apache.inlong.manager.common.enums.SinkType;
import org.apache.inlong.manager.common.pojo.sink.SinkFieldResponse;
import org.apache.inlong.manager.common.pojo.sink.SinkResponse;
+import org.apache.inlong.manager.common.pojo.sink.hive.HiveSinkResponse;
import org.apache.inlong.manager.common.pojo.sink.kafka.KafkaSinkResponse;
import org.apache.inlong.sort.protocol.FieldInfo;
import org.apache.inlong.sort.protocol.node.LoadNode;
@@ -33,6 +34,7 @@ import org.apache.inlong.sort.protocol.node.format.CsvFormat;
import org.apache.inlong.sort.protocol.node.format.DebeziumJsonFormat;
import org.apache.inlong.sort.protocol.node.format.Format;
import org.apache.inlong.sort.protocol.node.format.JsonFormat;
+import org.apache.inlong.sort.protocol.node.load.HiveLoadNode;
import org.apache.inlong.sort.protocol.node.load.KafkaLoadNode;
import org.apache.inlong.sort.protocol.transformation.FieldRelationShip;
@@ -55,6 +57,8 @@ public class LoadNodeUtils {
switch (sinkType) {
case KAFKA:
return createLoadNode((KafkaSinkResponse) sinkResponse);
+ case HIVE:
+ return createLoadNode((HiveSinkResponse) sinkResponse);
default:
throw new IllegalArgumentException(
String.format("Unsupported sinkType=%s to create
loadNode", sinkType));
@@ -114,6 +118,46 @@ public class LoadNodeUtils {
primaryKey);
}
+ public static HiveLoadNode createLoadNode(HiveSinkResponse
hiveSinkResponse) {
+ String id = hiveSinkResponse.getSinkName();
+ String name = hiveSinkResponse.getSinkName();
+ String database = hiveSinkResponse.getDbName();
+ String tableName = hiveSinkResponse.getTableName();
+ String hiveConfDir = hiveSinkResponse.getHiveConfDir();
+ String hiveVersion = hiveSinkResponse.getHiveVersion();
+ List<SinkFieldResponse> sinkFieldResponses =
hiveSinkResponse.getFieldList();
+ List<FieldInfo> fields = sinkFieldResponses.stream()
+ .map(sinkFieldResponse -> new
FieldInfo(sinkFieldResponse.getFieldName(), name,
+
FieldInfoUtils.convertFieldFormat(sinkFieldResponse.getFieldType(),
+
sinkFieldResponse.getFieldFormat()))).collect(Collectors.toList());
+ List<FieldRelationShip> fieldRelationShips =
parseSinkFields(sinkFieldResponses, name);
+ Map<String, String> properties =
hiveSinkResponse.getProperties().entrySet().stream()
+ .collect(Collectors.toMap(Map.Entry::getKey, e ->
e.getValue().toString()));
+ List<FieldInfo> partitionFields = Lists.newArrayList();
+ if
(CollectionUtils.isNotEmpty(hiveSinkResponse.getPartitionFieldList())) {
+ partitionFields = hiveSinkResponse.getPartitionFieldList().stream()
+ .map(hivePartitionField -> new
FieldInfo(hivePartitionField.getFieldName(), name,
+
FieldInfoUtils.convertFieldFormat(hivePartitionField.getFieldType(),
+
hivePartitionField.getFieldFormat()))).collect(Collectors.toList());
+ }
+ return new HiveLoadNode(
+ id,
+ name,
+ fields,
+ fieldRelationShips,
+ Lists.newArrayList(),
+ null,
+ properties,
+ null,
+ database,
+ tableName,
+ hiveConfDir,
+ hiveVersion,
+ null,
+ partitionFields
+ );
+ }
+
public static List<FieldRelationShip>
parseSinkFields(List<SinkFieldResponse> sinkFieldResponses, String sinkName) {
if (CollectionUtils.isEmpty(sinkFieldResponses)) {
return Lists.newArrayList();
diff --git
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/TransformNodeUtils.java
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/TransformNodeUtils.java
index 8952414b7..5221a300c 100644
---
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/TransformNodeUtils.java
+++
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sort/util/TransformNodeUtils.java
@@ -70,16 +70,12 @@ public class TransformNodeUtils {
*/
public static DistinctNode createDistinctNode(DeDuplicationDefinition
deDuplicationDefinition,
TransformResponse transformResponse) {
- String transformName = transformResponse.getTransformName();
List<StreamField> streamFields =
deDuplicationDefinition.getDupFields();
List<FieldInfo> distinctFields = streamFields.stream()
- .map(streamField -> new FieldInfo(streamField.getFieldName(),
transformName,
-
FieldInfoUtils.convertFieldFormat(streamField.getFieldType().name(),
- streamField.getFieldFormat())))
+ .map(streamField ->
FieldInfoUtils.parseStreamField(streamField))
.collect(Collectors.toList());
StreamField timingField = deDuplicationDefinition.getTimingField();
- FieldInfo orderField = new FieldInfo(timingField.getFieldName(),
transformName,
-
FieldInfoUtils.convertFieldFormat(timingField.getFieldType().name(),
timingField.getFieldFormat()));
+ FieldInfo orderField = FieldInfoUtils.parseStreamField(timingField);
DeDuplicationStrategy deDuplicationStrategy =
deDuplicationDefinition.getDeDuplicationStrategy();
OrderDirection orderDirection = null;
switch (deDuplicationStrategy) {
@@ -115,15 +111,8 @@ public class TransformNodeUtils {
TransformNode transformNode = new TransformNode();
transformNode.setId(transformResponse.getTransformName());
transformNode.setName(transformResponse.getTransformName());
- List<FieldInfo> fieldInfos =
transformResponse.getFieldList().stream().map(streamFieldInfo -> {
- String transformName = transformResponse.getTransformName();
- String fieldType = streamFieldInfo.getFieldType();
- String fieldFormat = streamFieldInfo.getFieldFormat();
- String fieldName = streamFieldInfo.getFieldName();
- FieldInfo fieldInfo = new FieldInfo(fieldName, transformName,
- FieldInfoUtils.convertFieldFormat(fieldType, fieldFormat));
- return fieldInfo;
- }).collect(Collectors.toList());
+ List<FieldInfo> fieldInfos = transformResponse.getFieldList().stream()
+ .map(streamFieldInfo ->
FieldInfoUtils.parseStreamField(streamFieldInfo)).collect(Collectors.toList());
transformNode.setFields(fieldInfos);
transformNode.setFieldRelationShips(FieldRelationShipUtils.createFieldRelationShips(transformResponse));
transformNode.setFilters(
diff --git
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/transform/StreamTransformServiceImpl.java
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/transform/StreamTransformServiceImpl.java
index 42785b8c4..9d3a31b2a 100644
---
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/transform/StreamTransformServiceImpl.java
+++
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/transform/StreamTransformServiceImpl.java
@@ -24,7 +24,7 @@ import org.apache.commons.lang3.tuple.Pair;
import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
import org.apache.inlong.manager.common.enums.GlobalConstants;
import org.apache.inlong.manager.common.exceptions.BusinessException;
-import org.apache.inlong.manager.common.pojo.stream.InlongStreamFieldInfo;
+import org.apache.inlong.manager.common.pojo.stream.StreamField;
import org.apache.inlong.manager.common.pojo.transform.TransformRequest;
import org.apache.inlong.manager.common.pojo.transform.TransformResponse;
import org.apache.inlong.manager.common.util.CommonBeanUtils;
@@ -105,10 +105,10 @@ public class StreamTransformServiceImpl implements
StreamTransformService {
.collect(Collectors.toList());
List<StreamTransformFieldEntity> transformFieldEntities =
transformFieldEntityMapper.selectByTransformIds(
transformIds);
- Map<Integer, List<InlongStreamFieldInfo>> fieldInfoMap =
transformFieldEntities.stream()
+ Map<Integer, List<StreamField>> fieldInfoMap =
transformFieldEntities.stream()
.map(transformFieldEntity -> {
- InlongStreamFieldInfo fieldInfo =
CommonBeanUtils.copyProperties(transformFieldEntity,
- InlongStreamFieldInfo::new);
+ StreamField fieldInfo =
CommonBeanUtils.copyProperties(transformFieldEntity,
+ StreamField::new);
return Pair.of(transformFieldEntity.getTransformId(),
fieldInfo);
}).collect(Collectors.groupingBy(Pair::getLeft,
Collectors.mapping(Pair::getRight,
Collectors.toList())));
@@ -117,7 +117,7 @@ public class StreamTransformServiceImpl implements
StreamTransformService {
.collect(Collectors.toList());
transformResponses.stream().forEach(transformResponse -> {
int transformId = transformResponse.getId();
- List<InlongStreamFieldInfo> fieldInfos =
fieldInfoMap.get(transformId);
+ List<StreamField> fieldInfos = fieldInfoMap.get(transformId);
if (CollectionUtils.isNotEmpty(fieldInfos)) {
transformResponse.setFieldList(fieldInfos);
}
@@ -184,7 +184,7 @@ public class StreamTransformServiceImpl implements
StreamTransformService {
Preconditions.checkNotNull(transformName,
ErrorCodeEnum.TRANSFORM_NAME_IS_NULL.getMessage());
}
- private void updateFieldOpt(StreamTransformEntity entity,
List<InlongStreamFieldInfo> fieldInfos) {
+ private void updateFieldOpt(StreamTransformEntity entity,
List<StreamField> fieldInfos) {
Integer transformId = entity.getId();
if (CollectionUtils.isEmpty(fieldInfos)) {
return;
@@ -198,7 +198,7 @@ public class StreamTransformServiceImpl implements
StreamTransformService {
log.info("success to update transform field");
}
- private void saveFieldOpt(StreamTransformEntity entity,
List<InlongStreamFieldInfo> fieldInfos) {
+ private void saveFieldOpt(StreamTransformEntity entity, List<StreamField>
fieldInfos) {
log.info("begin to save transform field={}", fieldInfos);
if (CollectionUtils.isEmpty(fieldInfos)) {
return;
@@ -210,7 +210,7 @@ public class StreamTransformServiceImpl implements
StreamTransformService {
String streamId = entity.getInlongStreamId();
String transformType = entity.getTransformType();
Integer transformId = entity.getId();
- for (InlongStreamFieldInfo fieldInfo : fieldInfos) {
+ for (StreamField fieldInfo : fieldInfos) {
StreamTransformFieldEntity fieldEntity =
CommonBeanUtils.copyProperties(fieldInfo,
StreamTransformFieldEntity::new);
if (StringUtils.isEmpty(fieldEntity.getFieldComment())) {
@@ -221,6 +221,7 @@ public class StreamTransformServiceImpl implements
StreamTransformService {
fieldEntity.setTransformId(transformId);
fieldEntity.setTransformType(transformType);
fieldEntity.setIsDeleted(GlobalConstants.UN_DELETED);
+ fieldEntity.setOriginNodeName(fieldInfo.getOriginNodeName());
entityList.add(fieldEntity);
}
diff --git
a/inlong-manager/manager-test/src/main/resources/sql/apache_inlong_manager.sql
b/inlong-manager/manager-test/src/main/resources/sql/apache_inlong_manager.sql
index 7d8146bb3..c86a00abc 100644
---
a/inlong-manager/manager-test/src/main/resources/sql/apache_inlong_manager.sql
+++
b/inlong-manager/manager-test/src/main/resources/sql/apache_inlong_manager.sql
@@ -633,8 +633,9 @@ CREATE TABLE `stream_transform_field`
`field_comment` varchar(2000) DEFAULT NULL COMMENT 'Field description',
`is_meta_field` smallint(3) DEFAULT '0' COMMENT 'Is this field a meta
field? 0: no, 1: yes',
`field_format` varchar(50) DEFAULT NULL COMMENT 'Field format,
including: MICROSECONDS, MILLISECONDS, SECONDS, SQL, ISO_8601 and custom such
as yyyy-MM-dd HH:mm:ss',
- `rank_num` smallint(6) DEFAULT '0' COMMENT 'Field order
(front-end display field order)',
- `is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete,
0: not deleted, > 0: deleted',
+ `rank_num` smallint(6) DEFAULT '0' COMMENT 'Field order (front-end
display field order)',
+ `is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete, 0: not
deleted, > 0: deleted',
+ `origin_node_name` varchar(256) DEFAULT '' COMMENT 'Origin Node name
which stream field belongs',
PRIMARY KEY (`id`),
KEY `index_transform_id` (`transform_id`)
) ENGINE = InnoDB
diff --git a/inlong-manager/manager-web/sql/apache_inlong_manager.sql
b/inlong-manager/manager-web/sql/apache_inlong_manager.sql
index 5d501a001..5d8a4ee63 100644
--- a/inlong-manager/manager-web/sql/apache_inlong_manager.sql
+++ b/inlong-manager/manager-web/sql/apache_inlong_manager.sql
@@ -665,6 +665,7 @@ CREATE TABLE `stream_transform_field`
`field_format` varchar(50) DEFAULT NULL COMMENT 'Field format,
including: MICROSECONDS, MILLISECONDS, SECONDS, SQL, ISO_8601 and custom such
as yyyy-MM-dd HH:mm:ss',
`rank_num` smallint(6) DEFAULT '0' COMMENT 'Field order
(front-end display field order)',
`is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete,
0: not deleted, > 0: deleted',
+ `origin_node_name` varchar(256) DEFAULT '' COMMENT 'Origin Node name
which stream field belongs',
PRIMARY KEY (`id`),
KEY `index_transform_id` (`transform_id`)
) ENGINE = InnoDB