我在 Postgresql 中有多个表格。比如,一个表有列A,列B,列C,refresh_date,财周。 B表有列D,列E,列B,财周,refresh_date。我想查找表A的当前周的记录总数以及表 当前周的E列总数。我正在使用Talend从表A和表B加载数据,这些表在Postgresql中。此外,如果列E的当前周值等于零,那么它应该向我自己发送邮件。 我想为此创建一个通用代码,因为这是针对表A和表B,将使用与此类似的多个表。如何在 Talend 和 Postgresql 中执行此操作?
答案 0 :(得分:1)
我几个月前创建了类似于你需要的东西,它基本上执行一个随机查询并解析结果集并将其非规范化存储在数据库表中。请注意,我使用的企业Talend具有称为动态架构的简洁功能: https://help.talend.com/pages/viewpage.action?pageId=190513179
那么我们应该从哪里开始呢? 我的典型查询如下所示:
select pk1 as rcr_grby_pk1, pk2 as rcr_grpby_pk2,
count(*) as cnt, sum(amount) as sum_amount
from mySchema.myTable
group by pk1, pk2
显然,Select查询可以是任何内容,可以包含任意数量的列。我们执行它并将结果存储在一个如下所示的表中:
-------------------------------------------------------- | schema | table | pk |measure_name| value_n | -------------------------------------------------------- | mySchema | myTable | foo2015 | cnt | 1234 | -------------------------------------------------------- | mySchema | myTable | foo2015 | sum_amount | 987.65 | -------------------------------------------------------- | mySchema | myTable | bar2014 | cnt | 4321 | -------------------------------------------------------- | mySchema | myTable | bar2014 | sum_amount | 567.89 | --------------------------------------------------------
我们区分了3种基本类型:文本,数字,日期。
我想您可以了解如何编写和存储这些SQL查询,以及可以传递给talend并存储在目标表中的ID,以便您可以看到生成该结果的内容。
所以加工件。 tFlowToIterate - > tJavaFlex - > tLogRow
我已将所有内容放入joblet中,因为我们正在使用它来协调不同数据库之间的数据。 (例如Oracle和Postgres) Joblet内容:
tJavaFlex有一个像这样的输出模式:
tJavaFlex内容是这样的:
开始:
Dynamic record = ((Dynamic)globalMap.get("input.line"));
String group_by_columns = "";
for(int i = 0 ; i < record.getColumnCount() ; i++) {
DynamicMetadata meta = record.getColumnMetadata(i);
if(meta.getDbName().toUpperCase().startsWith("RCR_GRPBY_") ){
group_by_columns += "" + record.getColumnValue(i);
}
}
for(int i = 0 ; i < record.getColumnCount() ; i++) {
DynamicMetadata meta = record.getColumnMetadata(i);
if(false == meta.getDbName().toUpperCase().startsWith("RCR_GRPBY_") ){
主:
out.grp_id = context.grp_id;
out.job_id = context.job_id;
out.table_test_id = context.table_test_id;
out.group_by_columns = group_by_columns;
out.measure_column_name = meta.getDbName().toUpperCase();
out.result_n = /* Float */ null;
out.result_v = /* String */ null;
out.result_d = /* Date */ null;
if( (record.getColumnValue(i)!=null) && ( meta.getType().equals("id_String") ) ){
out.result_v = String.valueOf(record.getColumnValue(i));
} else if( (record.getColumnValue(i)!=null) && meta.getType().equals("id_Date") ) {
System.out.println(String.valueOf(record.getColumnValue(i)));
out.result_d = (Date)record.getColumnValue(i);
} else if( (record.getColumnValue(i)!=null) && ( meta.getType().equals("id_Integer")
|| meta.getType().equals("id_Double")
|| meta.getType().equals("id_Float")
|| meta.getType().equals("id_Long") )) {
out.result_n = Float.valueOf(String.valueOf(record.getColumnValue(i)));
} else if( (record.getColumnValue(i)!=null) && ( meta.getType().equals("id_BigDecimal") ) ) {
out.result_n = new BigDecimal( String.valueOf(record.getColumnValue(i)) ).floatValue();
} else {
//Should not happen
System.out.println("\n Unhandled type: " + meta.getType() );
}
端:
} // if
} //for
PS:我知道Float是存储数字的不错选择,但是没有时间重做它,它仍然可以提供可接受的结果。