Talend Open Studio 7.1:tJavaFlex 输出问题
Talend Open Studio 7.1 : tJavaFlex output issue
我正在寻求你的帮助,我遇到了 tJavaFlex 组件的问题。
editorName ;ProductName ;end_date_resorption_versions;end_date_supported_versions ;end_date_recommended_versions
EditorA;PN_A;31/03/2017,31/03/2017,31/03/2017,31/03/2017,31/03/2017,31/03/2017;null;null
EditorA;PN_A;30/06/2024;null;30/06/2024
EditorA;PN_A;30/11/2020,30/06/2017;null;null
EditorA;PN_A;null;30/06/2024;null
EditorA;PN_A ;null;null;null
EditorA;PN_A;30/11/2020,30/11/2020;null;null
EditorB;PN_B;18/05/2017,31/03/2017,31/01/20;null;null
EditorB;PN_B;03/06/2024;01/02/2020;30/06/2024
EditorB;PN_B;23/12/2014 ;null;null
EditorB;PN_B;null;01/02/2020;30/06/2020
EditorB;PN_B;null;null;null
EditorB;PN_B;12/12/2012,31/12/2020;null;13/01/2020
如您所见,同一列中有日期列表(字符串格式)。
我想做的 ==> 找到每列(不是行)的最小日期
我的方法是这样的:
- 按列,将所有值存储在一个数组中
- 将 ListString 转换为 ListDate
- 在每个 ListDate 中查找日期最小值
我认为最好的方法是使用 tJavaFlex 组件。
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
**Start Code :**
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
// Array for end_date_resorption_versions
List<String> myStringList_edrv = new ArrayList<>();
List<Date> dates = new ArrayList<>();
// Array for end_date_supported_versions
List<String> myStringList_edsv = new ArrayList<>();
List<Date> dates_edsv = new ArrayList<>();
// Array for end_date_recommended_versions
List<String> myStringList_edrev = new ArrayList<>();
List<Date> dates_edrev = new ArrayList<>();
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
**main code :**
if (row4.end_date_resorption_versions == null ){
row4.end_date_resorption_versions = "31/12/2099";
}
if (row4.end_date_supported_versions == null ){
row4.end_date_supported_versions = "31/12/2099";
}
if (row4.end_date_recommended_versions == null) {
row4.end_date_recommended_versions = "31/12/2099";
}
// populating data :
myStringList_edrv.addAll(Arrays.asList(row4.end_date_resorption_versions.split(",")));
myStringList_edsv.addAll(Arrays.asList(row4.end_date_supported_versions.split(",")));
myStringList_edrev.addAll(Arrays.asList(row4.end_date_recommended_versions.split(",")));
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
**end code :**
// transform ListString to ListDate : end_date_resorption_versions
for (int i = 0 ; i < myStringList_edrv.size(); i++) {
dates.add(sdf.parse(myStringList_edrv.get(i)));
}
// transform ListString to ListDate : end_date_supported_versions
for (int i = 0 ; i < myStringList_edsv.size(); i++) {
dates_edsv.add(sdf.parse(myStringList_edsv.get(i)));
}
// transform ListString to ListDate : end_date_recommended_versions
for (int i = 0 ; i < myStringList_edrev.size(); i++) {
dates_edrev.add(sdf.parse(myStringList_edrev.get(i)));
}
// getMinDate : end_date_resorption_versions
row6.out_date_edrv = sdf.format(Collections.min(dates));
// getMinDate : end_date_supported_versions
row6.out_date_edsv = sdf.format(Collections.min(dates_edsv));
// getMinDate : end_date_recommended_versions
row6.out_date_edrev = sdf.format(Collections.min(dates_edrev));
row6.out_editor_name = row4.editor_name;
row6.out_product_name = row4.product_name;
System.out.println("out_date_edrv => " + row6.out_date_edrv);
System.out.println("out_date_edsv => " + row6.out_date_edsv);
System.out.println("out_date_edrev => " + row6.out_date_edrev);
我所有的值都是空的,而 system.out.println 中的结果很好
我的工作设计是:
tPostgresqlInput----row4(主要)----tJavaFlex_1----row6(主要)----tLogRow
如果能提供一些帮助,我们将不胜感激。
您不需要那么多 java 代码。这是一个仅使用 Talend 组件的解决方案,其优点是在您的需求发生变化时更易于维护。
我首先规范化您的日期列;如果只有 end_date_resorption_versions
可以包含日期列表,那么您可以跳过 tNormalize_2
和 tNormalize_3
,它们分别规范化 end_date_supported_versions
和 end_date_recommended_versions
。
可能不需要 tMap_1
,我用它来将 "null" 文字转换为 null
,因为我将您的示例数据复制粘贴到一个文件中用于我的测试,否则以下转换将失败。
tConvertType_1
然后将日期字符串转换为 Date 类型,方法是选中选项 "Auto cast",并设置架构如下:
最后,tAggregateRow_1
将对 editorName
和 ProductName
列进行分组,并从每个日期列中获取最小日期:
没有解释,只是一个讨厌的 hack:尝试在 tJavaFlex[=36= 之前插入一个 tFlowToIterate ] 并为 tJavaFlex 提供 iterate 流而不是 main 流(见下图)。
在这里,出于某种原因,我的 tJavaFlex 仅从输入 main 中读取 null 值流量
但是当通过 iterate 流程提供时,它设法读取完全相同的数据。
请注意,只要您的输入数据流未重命名(row4 在我的示例中),您就不必触摸 tJavaFlex 中的代码。
我完全不知道为什么或何时 tJavaFlex 不能很好地处理 main 类型的流,我觉得这很令人沮丧。如果有天才大师能给我解释一下,我将不胜感激!
我正在寻求你的帮助,我遇到了 tJavaFlex 组件的问题。
editorName ;ProductName ;end_date_resorption_versions;end_date_supported_versions ;end_date_recommended_versions
EditorA;PN_A;31/03/2017,31/03/2017,31/03/2017,31/03/2017,31/03/2017,31/03/2017;null;null
EditorA;PN_A;30/06/2024;null;30/06/2024
EditorA;PN_A;30/11/2020,30/06/2017;null;null
EditorA;PN_A;null;30/06/2024;null
EditorA;PN_A ;null;null;null
EditorA;PN_A;30/11/2020,30/11/2020;null;null
EditorB;PN_B;18/05/2017,31/03/2017,31/01/20;null;null
EditorB;PN_B;03/06/2024;01/02/2020;30/06/2024
EditorB;PN_B;23/12/2014 ;null;null
EditorB;PN_B;null;01/02/2020;30/06/2020
EditorB;PN_B;null;null;null
EditorB;PN_B;12/12/2012,31/12/2020;null;13/01/2020
如您所见,同一列中有日期列表(字符串格式)。
我想做的 ==> 找到每列(不是行)的最小日期
我的方法是这样的:
- 按列,将所有值存储在一个数组中
- 将 ListString 转换为 ListDate
- 在每个 ListDate 中查找日期最小值
我认为最好的方法是使用 tJavaFlex 组件。
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
**Start Code :**
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
// Array for end_date_resorption_versions
List<String> myStringList_edrv = new ArrayList<>();
List<Date> dates = new ArrayList<>();
// Array for end_date_supported_versions
List<String> myStringList_edsv = new ArrayList<>();
List<Date> dates_edsv = new ArrayList<>();
// Array for end_date_recommended_versions
List<String> myStringList_edrev = new ArrayList<>();
List<Date> dates_edrev = new ArrayList<>();
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
**main code :**
if (row4.end_date_resorption_versions == null ){
row4.end_date_resorption_versions = "31/12/2099";
}
if (row4.end_date_supported_versions == null ){
row4.end_date_supported_versions = "31/12/2099";
}
if (row4.end_date_recommended_versions == null) {
row4.end_date_recommended_versions = "31/12/2099";
}
// populating data :
myStringList_edrv.addAll(Arrays.asList(row4.end_date_resorption_versions.split(",")));
myStringList_edsv.addAll(Arrays.asList(row4.end_date_supported_versions.split(",")));
myStringList_edrev.addAll(Arrays.asList(row4.end_date_recommended_versions.split(",")));
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
**end code :**
// transform ListString to ListDate : end_date_resorption_versions
for (int i = 0 ; i < myStringList_edrv.size(); i++) {
dates.add(sdf.parse(myStringList_edrv.get(i)));
}
// transform ListString to ListDate : end_date_supported_versions
for (int i = 0 ; i < myStringList_edsv.size(); i++) {
dates_edsv.add(sdf.parse(myStringList_edsv.get(i)));
}
// transform ListString to ListDate : end_date_recommended_versions
for (int i = 0 ; i < myStringList_edrev.size(); i++) {
dates_edrev.add(sdf.parse(myStringList_edrev.get(i)));
}
// getMinDate : end_date_resorption_versions
row6.out_date_edrv = sdf.format(Collections.min(dates));
// getMinDate : end_date_supported_versions
row6.out_date_edsv = sdf.format(Collections.min(dates_edsv));
// getMinDate : end_date_recommended_versions
row6.out_date_edrev = sdf.format(Collections.min(dates_edrev));
row6.out_editor_name = row4.editor_name;
row6.out_product_name = row4.product_name;
System.out.println("out_date_edrv => " + row6.out_date_edrv);
System.out.println("out_date_edsv => " + row6.out_date_edsv);
System.out.println("out_date_edrev => " + row6.out_date_edrev);
我所有的值都是空的,而 system.out.println 中的结果很好
我的工作设计是:
tPostgresqlInput----row4(主要)----tJavaFlex_1----row6(主要)----tLogRow
如果能提供一些帮助,我们将不胜感激。
您不需要那么多 java 代码。这是一个仅使用 Talend 组件的解决方案,其优点是在您的需求发生变化时更易于维护。
我首先规范化您的日期列;如果只有 end_date_resorption_versions
可以包含日期列表,那么您可以跳过 tNormalize_2
和 tNormalize_3
,它们分别规范化 end_date_supported_versions
和 end_date_recommended_versions
。
可能不需要 tMap_1
,我用它来将 "null" 文字转换为 null
,因为我将您的示例数据复制粘贴到一个文件中用于我的测试,否则以下转换将失败。
tConvertType_1
然后将日期字符串转换为 Date 类型,方法是选中选项 "Auto cast",并设置架构如下:
最后,tAggregateRow_1
将对 editorName
和 ProductName
列进行分组,并从每个日期列中获取最小日期:
没有解释,只是一个讨厌的 hack:尝试在 tJavaFlex[=36= 之前插入一个 tFlowToIterate ] 并为 tJavaFlex 提供 iterate 流而不是 main 流(见下图)。
在这里,出于某种原因,我的 tJavaFlex 仅从输入 main 中读取 null 值流量
但是当通过 iterate 流程提供时,它设法读取完全相同的数据。 请注意,只要您的输入数据流未重命名(row4 在我的示例中),您就不必触摸 tJavaFlex 中的代码。
我完全不知道为什么或何时 tJavaFlex 不能很好地处理 main 类型的流,我觉得这很令人沮丧。如果有天才大师能给我解释一下,我将不胜感激!