帆软报表二次开发 之kudu 填报报表使用自定义提交方式实现批量增删改

1.背景
因中台使用hadoop技术栈,数据存在于hive中,为了满足填报数据能够实时关联中台数据。填报报表需要兼顾修改和查询功能。所以我们使用kudu引擎用于填报场景。
而帆软报表不支持kudu,进而需要自定义代码实现

2.代码如下

package impala.press;
 
import com.fr.data.DefinedSubmitJob;
import com.fr.data.JobValue;
import com.fr.log.FineLoggerFactory;
import com.fr.script.Calculator;
import org.apache.kudu.Schema;
import org.apache.kudu.client.*;
 
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
 
public class SubmitDemo6 extends DefinedSubmitJob {
    //kudu地址,需要加hosts映射
    final String master = "bigdata025.dmp.xxx.com:7051,bigdata026.dmp.xxx.com:7051,\" +\n" +
            "            \"bigdata027.dmp.xxx.com:7051";
    KuduClient client = new KuduClient.KuduClientBuilder(master).build();
    public SubmitDemo6() {
    }
    public String getJobType() {
        return " ";
    }
    //填报有多少字段,就定义多少个字母
    private JobValue A;
    private JobValue B;
    private JobValue C;
    private JobValue D;
    private JobValue E;
    private JobValue F;
    private JobValue G;
    private JobValue H;
    private JobValue I;
    private JobValue J;
    private JobValue K;
    private JobValue L;
    private JobValue M;
    private JobValue N;
    private JobValue O;
    private JobValue P;
    private JobValue Q;
    private JobValue R;
    private JobValue S;
    private JobValue T;
    public void doJob(Calculator calculator) throws Exception {
 
        FineLoggerFactory.getLogger().error("doJob函数"+"当前时间 "+new Date(System.currentTimeMillis()));
 
        KuduTable tb_name = client.openTable("impala::kudu_mro.dim_jzt_back_section_pre_mro_dd_copy");
        Schema schema=tb_name.getSchema();
         //任意一个单元格有改变,则调用upsert方法
         if (A.getState().checkChanged() ||B.getState().checkChanged() || C.getState().checkChanged() ||
                 D.getState().checkChanged() || E.getState().checkChanged() ||
                 F.getState().checkChanged() || G.getState().checkChanged() ||
        H.getState().checkChanged() || I.getState().checkChanged() ||
                J.getState().checkChanged() || K.getState().checkChanged() ||
                L.getState().checkChanged()  || M.getState().checkChanged() ||
                N.getState().checkChanged() || O.getState().checkChanged() ||
                P.getState().checkChanged() || Q.getState().checkChanged() ||
                R.getState().checkChanged() || S.getState().checkChanged()||
                T.getState().checkChanged()){
            FineLoggerFactory.getLogger().error("upsertRow --->before"+"当前时间 "+System.currentTimeMillis());
            upsertRow(client,tb_name,schema,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T);
            FineLoggerFactory.getLogger().error("upsertRow --->after"+"当前时间 "+System.currentTimeMillis());
 
        }  else if (A.getState().checkDeleted()) {
            FineLoggerFactory.getLogger().error("deleteRow --->before"+"当前时间 "+System.currentTimeMillis());
             deleteRow(client,tb_name,schema,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T);
            FineLoggerFactory.getLogger().error("deleteRow --->after"+"当前时间 "+System.currentTimeMillis());
        } else if (A.getState().checkDefault()) {
            FineLoggerFactory.getLogger().error("default");
        }
 
        FineLoggerFactory.getLogger().error("doJob结束"+"当前时间 "+System.currentTimeMillis());
 
    }
 
    public static void upsertRow(KuduClient client, KuduTable table,Schema schema, JobValue A, JobValue B, JobValue C,
                                 JobValue D, JobValue E, JobValue F, JobValue G, JobValue H,
                                 JobValue I, JobValue J, JobValue K,
                                 JobValue L,JobValue M,JobValue N,JobValue O,JobValue P,
                                 JobValue Q,JobValue R,JobValue S,JobValue T) throws Exception {
        FineLoggerFactory.getLogger().error("update 开始...");
        KuduSession kuduSession = client.newSession();
        //设置手动刷新
        kuduSession.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH);
        kuduSession.setMutationBufferSpace(1000);
        Upsert update = table.newUpsert();
 
        PartialRow row = update.getRow();
        FineLoggerFactory.getLogger().error("row 开始..." + row.toString());
 
        List<JobValue> list = Arrays.asList(A, B, C, D, E, F, G, H, I, J, K, L,M, N, O, P, Q, R, S, T);
 
        for(int i = 0 ; i < list.size() ; i ++ ){
            JobValue val = list.get(i);
            if(i>schema.getColumnCount()-1){
                break;
            }
         //将值放入row,判断单元格类型和空值判断
            if (schema.getColumnByIndex(i).getType().getName().equals("string") && (val != null && !"".equals(val))) {
                row.addString(schema.getColumnByIndex(i).getName(), (String) val.getValue());
            }
            //decimal如果为空,则是[],这是帆软特有的
            else if (schema.getColumnByIndex(i).getType().getName().equals("decimal")
                    && (!Pattern.compile("^\\[").matcher(val.toString()).find())) {
                row.addDecimal(schema.getColumnByIndex(i).getName(), new BigDecimal(val.getValue().toString()));
            }
           else if (schema.getColumnByIndex(i).getType().getName().equals("unixtime_micros")) {
                row.addTimestamp(schema.getColumnByIndex(i).getName(), new Timestamp(System.currentTimeMillis()));
            }
            //int如果为空,则是[],这是帆软特有的
           else if (
                    schema.getColumnByIndex(i).getType().getName().equals("int32")
                            && (!Pattern.compile("^\\[").matcher(val.toString()).find())
 
            ) {
                row.addInt(schema.getColumnByIndex(i).getName(), (Integer) val.getValue());
            }
            FineLoggerFactory.getLogger().error("val.getValue()..." + val.getValue() + "当前时间 " + System.currentTimeMillis());
        }
 
        kuduSession.apply(update);
 
        FineLoggerFactory.getLogger().error("打印row update after" + row.toString());
 
        //使用MANUAL_FLUSH模式
        kuduSession.flush();
        kuduSession.close();
    }
 
    public static void deleteRow(KuduClient client, KuduTable table,Schema schema, JobValue A, JobValue B, JobValue C,
                                 JobValue D, JobValue E, JobValue F, JobValue G, JobValue H,
                                 JobValue I, JobValue J, JobValue K,
                                 JobValue L,JobValue M,JobValue N,JobValue O,JobValue P,
                                 JobValue Q,JobValue R,JobValue S,JobValue T) throws Exception {
        KuduSession kuduSession = client.newSession();
        //设置手动刷新
        kuduSession.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH);
        kuduSession.setMutationBufferSpace(1000);
        FineLoggerFactory.getLogger().error("kuduSession 删除"+"当前时间 "+System.currentTimeMillis());
        Delete delete = table.newDelete();
        PartialRow row = delete.getRow();
 
        List<JobValue> list = Arrays.asList(A, B, C, D, E, F, G, H, I, J, K, L,M, N, O, P, Q, R, S, T);
 
        for(int i = 0 ; i < list.size() ; i ++ ){
            JobValue val = list.get(i);
            if(i>schema.getColumnCount()-1){
                break;
            }
            //将值放入row,判断单元格类型和空值判断
            if (schema.getColumnByIndex(i).getType().getName().equals("string") && (val != null && !"".equals(val))) {
                row.addString(schema.getColumnByIndex(i).getName(), (String) val.getValue());
            }
            //decimal如果为空,则是[],这是帆软特有的
            else if (schema.getColumnByIndex(i).getType().getName().equals("decimal")
                    && (!Pattern.compile("^\\[").matcher(val.toString()).find())) {
                row.addDecimal(schema.getColumnByIndex(i).getName(), new BigDecimal(val.getValue().toString()));
            }
           else if (schema.getColumnByIndex(i).getType().getName().equals("unixtime_micros")) {
                row.addTimestamp(schema.getColumnByIndex(i).getName(), new Timestamp(System.currentTimeMillis()));
            }
            //int如果为空,则是[],这是帆软特有的
          else  if ( schema.getColumnByIndex(i).getType().getName().equals("int32")
                            && (!Pattern.compile("^\\[").matcher(val.toString()).find())) {
                row.addInt(schema.getColumnByIndex(i).getName(), (Integer) val.getValue());
            }
            FineLoggerFactory.getLogger().error("val.getValue()..." + val.getValue() + "当前时间 " + System.currentTimeMillis());
        }
 
        FineLoggerFactory.getLogger().error("delete打印"+"当前时间 "+System.currentTimeMillis());
 
        kuduSession.apply(delete);
 
        FineLoggerFactory.getLogger().error("打印row delete after" + row.toString());
        //使用MANUAL_FLUSH模式
        kuduSession.flush();
 
        kuduSession.close();
    }
 
}

3.操作步骤

1.将kudu-client-1.16.0.jar 和async-1.4.1.jar 放置 FineReport_11.0\webapps\webroot\WEB-INF\lib 下,重启帆软设计器

2.新建帆软填报报表,将以上代码拷贝至报表填报属性的编辑框中,并点击编译和保存。

3.添加属性,将代码的属性和单元格进行绑定

左侧 属性名保持不变,由A到Z. 右侧单元格的值按照实际填写即可。完成后点击保存

对于小于20个字段的填报,属性值可以填成其他单元格的值,如下

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值