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.

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

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

 
 
 
 
 

通过AMDP调用HANA的PAL函数的更多相关文章

  1. mfc 调用Windows的API函数实现同步异步串口通信(源码)

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

  2. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

  3. C#调用C和C++函数的一点区别

    最近做U800电话的二次开发,需要调用厂商的C函数库来打电话,后来想加入通话录音功能,但发现程序默认生产的WAV文件过大,又找了个WAV转MP3的C++函数库程序,出了点问题.下面是转MP3的程序接口 ...

  4. 在VS2012中采用C++中调用DLL中的函数 (4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

  5. 在C++中调用DLL中的函数 (3)

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  6. 在C++中调用DLL中的函数 (2)

    应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息. Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin. ...

  7. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fen ...

  8. 在C++中调用DLL中的函数

    如何在C++中调用DLL中的函数 应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0在VC\bin目录下 ...

  9. c#调用js,以及js调用C#里的函数, c#自己生成js代码,实现对web的控制

    using mshtml;using System;using System.Collections.Generic;using System.Linq;using System.Security.P ...

  10. 为什么在DllMain里不能调用LoadLibrary和FreeLibrary函数?

    为什么在DllMain里不能调用LoadLibrary和FreeLibrary函数? MSDN里对这个问题的答案十分的晦涩.不过现在我们已经有了足够的知识来解答这个问题.考虑下面的情况:       ...

随机推荐

  1. 假期做了一项调研:大厂为啥都自研RPC?结果合乎情理!

    大家好,我是冰河~~ 五一假期过的可真快,今天开始,又要搬砖了.在五一假期当中,冰河做了一项调研,感觉结果还是挺合乎情理的. 翻看招聘信息 先来看我在某招聘网站上随便搜索了下Java招聘的岗位,看到的 ...

  2. 运行xxl-job,整合xxl-job至jeecg-boot项目

    1.前言:xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 源码仓库地址:https://gitee.co ...

  3. 网络设备性能指标之pps

    基本概念: Bps:Byte per second 每秒传输多少字节 bps: bits per second 每秒传输多少位 ,这个也叫做端口速率 pps:Packet Per Second(包每秒 ...

  4. 基于spring-boot、grpc、zookeeper的分布式微服务架构

    总览: 开源.高性能.多语言.跨平台.易扩展rpc框架 . Protocol Buffers 使用 默认使用 protocol buffers,Google 开源的成熟序列化机制: 文件格式:.pro ...

  5. 使用OHOS SDK构建filament

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从gitee下载源码. 执行如下命令: git clone https://gitee.com/oh-graphics/filament.git ...

  6. 你真会判断DataGuard的延迟吗?

    这是一个比较细节的知识点,但必须要理解这个才能准确判断Oracle ADG的延迟情况. 以前做运维工作时,记得是要同时重点关注v$dataguard_stats视图中的几个字段的值,分别是:NAME. ...

  7. HDC2021技术分论坛:鸿蒙智联平台——智能硬件伙伴的最佳拍档

    作者:chengjie,鸿蒙智联生态服务平台运营经理 您在产品开发和运营过程中是否遇到过以下问题: 产品开发千头万绪,无从下手?产品上市后不能清晰地了解消费者的使用情况?用户的意见无法及时传递和答复, ...

  8. HDD杭州站·HarmonyOS技术专家分享HUAWEI DevEco Studio特色功能

    原文:https://mp.weixin.qq.com/s/87diJ1RePffgaFyd1VLijQ,点击链接查看更多技术内容. 7月15日,HUAWEI Developer Day(简称HDD) ...

  9. triple loss

    Triplet Loss是深度学习中的一种损失函数,用于训练差异性较小的样本,如人脸等, Feed数据包括锚(Anchor)示例.正(Positive)示例.负(Negative)示例,通过优化锚示例 ...

  10. jenkins 持续集成和交付 —— 参数化构建(八)

    前言 这个其实就是我们构建的脚本时候希望能有一些变量,能给我们更多的选择. 正文 选择这个: 填好后,这边就有一个参数配置: 那么接下来就是把变量放到我们的脚本中. 如下: 脚本变成变量符,这样就ok ...