Talend greenplumRow обработка ошибок
Я хочу создать представления в greenplum HAWQ, используя простое задание talend, которое в основном будет иметь 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|
'------------'
Я хочу иметь этот вывод 3 раза, так как я пытаюсь запустить 3 раза запрос. (В окончательной версии я бы создал другой файл, содержащий только неудачные запросы, чтобы мы могли исправить это позже, но это критический момент.)
как обходной путь: Я мог бы переместить эту часть tRow -> OnError -> FixedFlow -> FailedViews в другую работу, но это не элегантное решение.
1 ответов
сделайте это с помощью tJavaFlex. Он также работает для Greenplumrow!!! В приведенном ниже exmaple я выполняю запрос в 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. (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();
}