【问题标题】:Talend greenplumRow error handlingTalend greenplumRow 错误处理
【发布时间】:2014-09-21 06:11:12
【问题描述】:

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

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

这是我的问题的模型:

我已经在数据库中有一个视图,我想再创建 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|
'------------'

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

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

【问题讨论】:

  • 我不明白你在这里做什么。既然知道重复尝试会失败,为什么还要尝试创建 3 次视图?
  • 我想在 SQL 失败时进行错误处理。最容易重现错误的是运行 3 次 -> 我想捕获错误 3 次。
  • 那么问题是什么?您想在 SQL 错误失败时记录?应该将其写入日志,而无需您捕获错误然后将其扔到日志中,正如您在输出的一开始就可以看到的那样。
  • 我有一个包含 98523 SQL 的文件,如果第一个失败 -> 整个执行停止。我预计一半的 SQL 会失败,我想检查/重新执行它们。如果我想再次执行所有 SQL-s,它们都会失败。
  • 如果您不勾选“出错时死”框并且作业下游不需要来自 SQL 查询的数据,那么它应该继续处理并且日志将包含所有失败的查询。您实际上可以在您的设置中看到这一点,因为 tLogRow5 有一些数据,并且该子作业仅在发生 SQL 错误的子作业上执行。

标签: etl talend greenplum hawq


【解决方案1】:

用 tJavaFlex 来做。它也适用于 Greenplumrow !!!在下面的示例中,我在 tOracleInput_6 中执行了一个查询:

"SELECT count(*) FROM "+((String)globalMap.get("ora_sch.SCHEMA_NAME")) + "." + ((String)globalMap.get("ora_tab.TABLE_NAME"))

我不确定查询结果。它可能会失败(例如:有人刚刚删除了表)因此我使用 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多