• 集算器协助Java处理JSON


      json是半结构化数据,JAVA只能简单解析,很难进行深度计算。集算器支持集合运算、有序计算、动态脚本执行,可降低json的计算难度。集算器还提供了简单易用的JDBC接口,JAVA可将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果,详情参考集算器用作Java计算类库的应用结构

      下面举例说明JAVA处理json时常见的难题,以及集算器对应的解法。

      json分组汇总

      order.json存储着订单记录,现在要按时间段汇总每个月每个客户贡献的销售额,部分源数据如下:

    esProc_java_json_1

      集算器代码:

     

    A

    1

    =file(“D:\order.json”).read().import@j()

    2

    =A1.select(OrderDate>=argBegin && OrderDate<=argEnd)

    3

    =A2.groups(month(OrderDate):Month,Client;sum(Amount):subtotal)

      将json文件读为二维表,进行性条件查询,再进行分组汇总,其中argBegin、argEnd是JAVA参数。结果如下:

    esProc_java_json_3

      解析字段不定的json

      Data.json每个文档的字段数不定,字段顺序不定,如下:

    esProc_java_json_4

      需要用JAVA程序将该文件输出到csv,期望的格式如下:

    esProc_java_json_5

      集算器代码:

    1

    =file(“d:\data.json”).read().import@j()

    2

    =A1.People

    3

    =file(“D:\result.csv”).export(A2;”,”)

      将json读入内存,取出People字段,以逗号为分隔符写入文件,其中A2如下:

    esProc_java_json_7

      将多层json输出为csv

      源json文件如下:

    esProc_java_json_8

      期望在CSV中分两列摆放,如下:

    esProc_java_json_9

      难点在于root的字段名要和下级合并,下级字段名和字段值要各对应结果中的一列。集算器代码:

    1

    =file(“d:\source.json”).read().import@j()

    2

    =A1.fno().(pjoin([f=A1.field(~)].fname():key,f.array():value))

    3

    =A2.(~.record@i([A1.fname(#),null],1))

    4

    =A3.conj()

    5

    =file(“D:\result.csv”).export(A4;”,”)

      读入json文件,将数据按root数分为3组,如下(A2):

    esProc_java_json_11

      之后将[root字段名,null]作为记录插入各组第1条,再合并各组记录,最后导出。Csv文件如下:

    esProc_java_json_12

      动态json入库

      s.json包含多层子文档,其LIST子文档和SERVICE子文档的字段数不定,要求用JAVA将s.json导入库表groups和service,规则是GROUPNAME的值和SERVICE的字段名对应数据库表groups,SERVICE的每个字段对应库表service,groups和service以groupsid相关联。

      源数据如下:

    esProc_java_json_13

      集算器代码:

     

    A

    B

    C

    D

    1

    =file(“E:\s.json”).read().import@j()

    2

    =create(Groupname,groupid)

    3

    =create(Serviceid,Servicename,groupid,Credit,Time,INFO,Network,Mobile,Provider,
    PIN,KBH,MEP,PRD,Type,Locks,Reference)

    4

    for A1.SUCCESS =A4.LIST    

    5

      for B4.fno() =B4.field(B5)

    6

        =C5.SERVICES

    7

        for C6.fno() =C6.fname(C7)  

    8

          =C6.field(C7)  

    9

          =A2.record([C5.GROUPNAME,D7])  

    10

          =A3.record([D8.#1,D8.#2,D7,D8.#3,D8.#4,
    D8.#5,D8.#6,D8.#7,D8.#8,D8.#9,
    D8.#10,D8.#11,D8.#12,D8.#13,
    D8.#14,D8.#15])
     

    11

    =mssql.update(A2,groups,Groupname,groupid;groupid)

    12

    =mssql.update(A3,services,Serviceid,Servicename,groupid,Credit,Time,INFO,Network,
    Mobile,Provider,PIN,KBH,MEP,PRD,Type,Locks,Reference;Serviceid)

      保持结构读入json文件,分别循环SUCCESS的每个子文档(B4-D10)、List的每个字段(C5-D10)、Service的每个字段(D7-D10),将对应的记录追加到空二维表A2、A3,最后入库。代码中用到了访问二维表结构的几个函数,其中fno可取得字段数,fname按序号取得字段名,field可按序号取得字段值。

      追加记录后A2、A3分别如下:

    esProc_java_json_15

  • 相关阅读:
    redis主从同步
    redis持久化
    redis发布订阅
    mariadb主从复制,
    nginx+uwsgi+django+virtualenv+supervisor发布web服务器
    Oracle 11gR2 RAC Installation on Oracle Linux 6.5
    ORA-1555 causes and solutions
    Linux实时查看日志的四种命令详解
    Linux查看日志常用命令
    oracle 11g 静默安装
  • 原文地址:https://www.cnblogs.com/raqsoft/p/4990475.html
Copyright © 2020-2023  润新知