Talend greenplumRow错误处理

Bal*_*ics 7 etl talend greenplum hawq

我想使用一个简单的talend作业在greenplum HAWQ中创建视图,它基本上有一个fileinput包含我需要执行CREATE VIEW脚本的所有视图.

由于这些视图(50-60.000)来自oracle系统,我需要找到我们无法创建的视图.

这是我的问题的模拟: 在此输入图像描述

我已经在数据库中有了一个视图,我想再创建它3次.这显然会失败.

这是输出:

Exception in component tGreenplumRow_2
org.postgresql.util.PSQLException: ERROR: relation "ad_apps_dependencies" already exists
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
.--------------.
|  tLogRow_4   |
|=------------=|
|componenterror|
|=------------=|
|componenterror|
'--------------'

.-----------------------------------------------------+-------------------------------------------------------------.
|                                                                                  tLogRow_5                        |
|=----------------------------------------------------+------------------------------------------------------------=|
|result                                               |result1                                                      |
|=----------------------------------------------------+------------------------------------------------------------=|
|ERROR: relation "ad_apps_dependencies" already exists|CREATE VIEW SYSTEM.AD_APPS   AS SELECT * FROM APPLSYS.AD_APPS|
'-----------------------------------------------------+-------------------------------------------------------------'

.------------.
| tLogRow_6  |
|=----------=|
|subjobError |
|=----------=|
|Subjob Error|
'------------'
Run Code Online (Sandbox Code Playgroud)

我希望这个输出有3次,因为我尝试运行3次查询.(在最终版本中,我将创建另一个仅包含失败查询的文件,因此我们稍后可以修复它,但这是关键点.)

作为一种解决方法:我可以将此tRow - > OnError - > FixedFlow - > FailedViews部分移动到不同的作业中,但这不是一个优雅的解决方案.

moh*_*har 0

使用 tJavaFlex 进行此操作。它也适用于 Greenplumrow!在下面的示例中,我在 tOracleInput_6 中执行查询:

"SELECT count(*) FROM "+((String)globalMap.get("ora_sch.SCHEMA_NAME")) + "." + ((String)globalMap.get("ora_tab.TABLE_NAME"))
Run Code Online (Sandbox Code Playgroud)

我不确定查询结果。它可能会失败(例如:有人刚刚删除了表)因此我使用 tJavaFlex+iterate 连接!生成的代码生成 try {...} catch 块。

在下面的情况下,我迭代模式的表并计算每个表中的行数。我将异常收集到 java hashmap 中。(哈希图在上下文中,但那是另一个故事了)

在此输入图像描述

tJavaFlex Begin code:
try{

tJavaflex main code:
// here is the main part of the component,
// a piece of code executed in the row
// loop
System.out.println(((String)globalMap.get("TYPE"))+" SELECT count(*) FROM "+((String)globalMap.get("ora_sch.SCHEMA_NAME")) + "." + ((String)globalMap.get("ora_tab.TABLE_NAME")));


tJavaFlex1 End code:
// end of the component, outside/closing the loop
} catch (Exception e) {
//put 
((Map<String, String>)context.EXCEPTIONS).put(
  ((String)globalMap.get("TYPE"))+((String)globalMap.get("ora_sch.SCHEMA_NAME"))+"_"
  +((Integer)globalMap.get("tFlowToIterate_8_CURRENT_ITERATION")).toString(),
((String)globalMap.get("ora_sch.SCHEMA_NAME"))+","
+ ((String)globalMap.get("ora_tab.TABLE_NAME")));

//print some debug message
System.out.print(((String)globalMap.get("TYPE"))+" ### SQL Exception at ");
System.out.print("Iteration Number: "+((Integer)globalMap.get("tFlowToIterate_8_CURRENT_ITERATION")).toString()+","+((String)globalMap.get("ora_sch.SCHEMA_NAME"))+","+ ((String)globalMap.get("ora_tab.TABLE_NAME")));
System.out.println(" ###");
//e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)