zoukankan      html  css  js  c++  java
  • 通过AMDP调用HANA的PAL函数

    SAP预测分析库(SAP Predictive Analysis Library,PAL)是SAP HANA中的一项功能,它允许我们在SAP HANA SQLScript过程中执行分析算法。

    基于ABAP的SAP应用可以调用PAL提供的功能,包含分类,回归,聚类,关联规则,社交网络分析,推荐系统等。通常使用AMDP来实现调用。

    AMDP(ABAP-Managed Database Procedures)是一种在SAP HANA中进行ABAP开发时可以使用的代码优化模式,简而言之,它可以让开发者在ABAP中写HANA数据库存储过程。

    本文链接:https://www.cnblogs.com/hhelibeb/p/12610644.html

    英文原文:An example to call PAL Apriori via AMDP

    示例

    接下来用一个例子来展示如何使用PAL。这里用到的PAL函数是Apriori

    步骤一(可选) 熟悉使用SQLScript调用PAL函数

    如果你已经熟悉PAL的HANA存储过程接口和它的调用,可以跳过这步。

    通过HANA Studio连接HANA数据库,运行下面的脚本:

    SET SCHEMA ZHAOJE;
    
    DROP TABLE PAL_APRIORI_PARAMETER_TBL;
    CREATE COLUMN TABLE PAL_APRIORI_PARAMETER_TBL (
    “PARAM_NAME ” VARCHAR(100),
    “INT_VALUE” INTEGER,
    “DOUBLE_VALUE” DOUBLE,
    “STRING_VALUE” VARCHAR (100)
    );
    INSERT INTO PAL_APRIORI_PARAMETER_TBL VALUES (‘MIN_SUPPORT’, null, 0.1, null);
    INSERT INTO PAL_APRIORI_PARAMETER_TBL VALUES (‘MIN_CONFIDENCE’, null, 0.3, null);
    INSERT INTO PAL_APRIORI_PARAMETER_TBL VALUES (‘MIN_LIFT’, null, 1.1, null);
    INSERT INTO PAL_APRIORI_PARAMETER_TBL VALUES (‘MAX_CONSEQUENT’, 1, null, null);
    INSERT INTO PAL_APRIORI_PARAMETER_TBL VALUES (‘PMML_EXPORT’, 1, null, null);
    
    DROP TABLE PAL_APRIORI_TRANS_TBL;
    CREATE COLUMN TABLE PAL_APRIORI_TRANS_TBL (
    “CUSTOMER” INTEGER,
    “ITEM” VARCHAR(20)
    );
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (2, ‘item2’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (2, ‘item3’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (3, ‘item1’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (3, ‘item2’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (3, ‘item4’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (4, ‘item1’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (4, ‘item3’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (5, ‘item2’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (5, ‘item3’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (6, ‘item1’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (6, ‘item3’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (0, ‘item1’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (0, ‘item2’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (0, ‘item5’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (1, ‘item2’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (1, ‘item4’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (7, ‘item1’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (7, ‘item2’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (7, ‘item3’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (7, ‘item5’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (8, ‘item1’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (8, ‘item2’);
    INSERT INTO PAL_APRIORI_TRANS_TBL VALUES (8, ‘item3’);
    
    CALL _SYS_AFL.PAL_APRIORI(PAL_APRIORI_TRANS_TBL, PAL_APRIORI_PARAMETER_TBL, ?, ?);

    你会看到下面的挖掘结果,

    步骤二 写AMDP代码,调用PAL过程

    下面是一个AMDP类例子,它调用了PAL Apriori过程。你可以在Eclipse里编辑自己的AMDP代码。

    CLASS zcl_amdp_pal DEFINITION
    PUBLIC
    FINAL
    CREATE PUBLIC .PUBLIC SECTION.
      INTERFACES if_amdp_marker_hdb.
      TYPES: BEGIN OF ty_apdata,
               customer TYPE i,
               item     TYPE c LENGTH 10,
             END OF ty_apdata,
             tt_apdata TYPE STANDARD TABLE OF ty_apdata,
    
             BEGIN OF ty_apparams,
               name       TYPE c LENGTH 60,
               intargs    TYPE i,
               doubleargs TYPE float,
               stringargs TYPE c LENGTH 100,
             END OF ty_apparams,
             tt_apparams TYPE STANDARD TABLE OF ty_apparams,
    
             ty_metric   TYPE p LENGTH 5 DECIMALS 4,
             BEGIN OF ty_aprules,
               antecedent TYPE c LENGTH 20,
               consequent TYPE c LENGTH 10,
               support    TYPE ty_metric,
               confidence TYPE ty_metric,
               lift       TYPE ty_metric,
             END OF ty_aprules,
             tt_aprules TYPE STANDARD TABLE OF ty_aprules,
    
             BEGIN OF ty_appmml,
               row_index     TYPE i,
               model_content TYPE c LENGTH 500,
             END OF ty_appmml,
             tt_appmml TYPE STANDARD TABLE OF ty_appmml.
    
      METHODS apriori_proc_call
        IMPORTING
          VALUE(it_vapdata)  TYPE tt_apdata
          VALUE(it_apparams) TYPE tt_apparams
        EXPORTING
          VALUE(et_ap_rules) TYPE tt_aprules
          VALUE(et_ap_pmml)  TYPE tt_appmml.
    
      PROTECTED SECTION.
      PRIVATE SECTION.
    ENDCLASS.
    
    CLASS zcl_amdp_pal IMPLEMENTATION.
    
      METHOD apriori_proc_call BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT.
        CALL _SYS_AFL.PAL_APRIORI(:it_vapdata, :it_apparams, et_ap_rules, et_ap_pmml);
      ENDMETHOD.
    
    ENDCLASS.

    步骤三 在ABAP程序中调用AMDP方法

    示例报表代码如下,

    REPORT zz_apriori_test.
    
    DATA: lt_data    TYPE zcl_amdp_pal=>tt_apdata,
          ls_data    LIKE LINE OF lt_data,
          lt_param   TYPE zcl_amdp_pal=>tt_apparams,
          ls_param   LIKE LINE OF lt_param,
          lt_rules   TYPE zcl_amdp_pal=>tt_aprules,
          lt_pmml    TYPE zcl_amdp_pal=>tt_appmml,
          lr_wrapper TYPE REF TO zcl_amdp_pal.
    
    ls_data-customer = 2. ls_data-item = 'item2'. APPEND ls_data TO lt_data.
    ls_data-customer = 2. ls_data-item = 'item3'. APPEND ls_data TO lt_data.
    ls_data-customer = 3. ls_data-item = 'item1'. APPEND ls_data TO lt_data.
    ls_data-customer = 3. ls_data-item = 'item2'. APPEND ls_data TO lt_data.
    ls_data-customer = 3. ls_data-item = 'item4'. APPEND ls_data TO lt_data.
    ls_data-customer = 4. ls_data-item = 'item1'. APPEND ls_data TO lt_data.
    ls_data-customer = 4. ls_data-item = 'item3'. APPEND ls_data TO lt_data.
    ls_data-customer = 5. ls_data-item = 'item2'. APPEND ls_data TO lt_data.
    ls_data-customer = 5. ls_data-item = 'item3'. APPEND ls_data TO lt_data.
    ls_data-customer = 6. ls_data-item = 'item1'. APPEND ls_data TO lt_data.
    ls_data-customer = 6. ls_data-item = 'item3'. APPEND ls_data TO lt_data.
    ls_data-customer = 0. ls_data-item = 'item1'. APPEND ls_data TO lt_data.
    ls_data-customer = 0. ls_data-item = 'item2'. APPEND ls_data TO lt_data.
    ls_data-customer = 0. ls_data-item = 'item5'. APPEND ls_data TO lt_data.
    ls_data-customer = 1. ls_data-item = 'item2'. APPEND ls_data TO lt_data.
    ls_data-customer = 1. ls_data-item = 'item4'. APPEND ls_data TO lt_data.
    ls_data-customer = 7. ls_data-item = 'item1'. APPEND ls_data TO lt_data.
    ls_data-customer = 7. ls_data-item = 'item2'. APPEND ls_data TO lt_data.
    ls_data-customer = 7. ls_data-item = 'item3'. APPEND ls_data TO lt_data.
    ls_data-customer = 7. ls_data-item = 'item5'. APPEND ls_data TO lt_data.
    ls_data-customer = 8. ls_data-item = 'item1'. APPEND ls_data TO lt_data.
    ls_data-customer = 8. ls_data-item = 'item2'. APPEND ls_data TO lt_data.
    ls_data-customer = 8. ls_data-item = 'item3'. APPEND ls_data TO lt_data.
    
    CLEAR ls_param. ls_param-name = 'THREAD_NUMBER'. ls_param-intargs = 2. APPEND ls_param TO lt_param.
    CLEAR ls_param. ls_param-name = 'MIN_SUPPORT'. ls_param-doubleargs = '0.1'. APPEND ls_param TO lt_param.
    CLEAR ls_param. ls_param-name = 'MIN_CONFIDENCE'. ls_param-doubleargs = '0.3'. APPEND ls_param TO lt_param.
    CLEAR ls_param. ls_param-name = 'MIN_LIFT'. ls_param-doubleargs = '1.1'. APPEND ls_param TO lt_param.
    CLEAR ls_param. ls_param-name = 'MAX_CONSEQUENT'. ls_param-intargs = 1. APPEND ls_param TO lt_param.
    
    CREATE OBJECT lr_wrapper.
    CALL METHOD lr_wrapper->apriori_proc_call
      EXPORTING
        it_vapdata  = lt_data
        it_apparams = lt_param
      IMPORTING
        et_ap_rules = lt_rules
        et_ap_pmml  = lt_pmml.
    
    TRY.
        cl_salv_table=>factory(
        IMPORTING
        r_salv_table = DATA(lr_table)
        CHANGING
        t_table = lt_rules ).
        DATA(lr_functions) = lr_table->get_functions( ).
        lr_functions->set_default( abap_true ).
        DATA(lr_columns) = lr_table->get_columns( ).
        DATA(lr_column_1) = lr_columns->get_column('ANTECEDENT').
        lr_column_1->set_long_text('ANTECEDENT'). lr_column_1->set_medium_text('ANTECEDENT'). lr_column_1->set_short_text('ANTECEDENT').
        DATA(lr_column_2) = lr_columns->get_column('CONSEQUENT').
        lr_column_2->set_long_text('CONSEQUENT'). lr_column_2->set_medium_text('CONSEQUENT'). lr_column_2->set_short_text('CONSEQUENT').
        DATA(lr_column_3) = lr_columns->get_column('SUPPORT').
        lr_column_3->set_long_text('SUPPORT' ). lr_column_3->set_medium_text('SUPPORT'). lr_column_3->set_short_text('SUPPORT').
        DATA(lr_column_4) = lr_columns->get_column('CONFIDENCE').
        lr_column_4->set_long_text('CONFIDENCE'). lr_column_4->set_medium_text('CONFIDENCE'). lr_column_4->set_short_text('CONFIDENCE').
        DATA(lr_column_5) = lr_columns->get_column('LIFT').
        lr_column_5->set_long_text('LIFT'). lr_column_5->set_medium_text('LIFT'). lr_column_5->set_short_text('LIFT').
        lr_table->display( ).
      CATCH cx_salv_msg.                                    "#EC NO_HANDLER
      CATCH cx_salv_not_found.                              "#EC NO_HANDLER
    ENDTRY.

    成功执行后,可以看到如下的执行结果:

     可以在相关的应用中使用这些结果。

     
     
     
     
     
  • 相关阅读:
    ehcache memcache redis 三大缓存男高音
    tomcat启用压缩的方式
    Linux rpm 命令参数使用详解[介绍和应用]
    rpm常用命令及rpm参数介绍
    RPM 命令大全
    BZOJ2298: [HAOI2011]problem a(带权区间覆盖DP)
    BZOJ2037: [Sdoi2008]Sue的小球(区间DP)
    HDU3507 Print Article(斜率优化DP)
    线性代数学习笔记(几何版)
    HDU 2065 "红色病毒"问题(生成函数)
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/12610644.html
Copyright © 2011-2022 走看看