您好,
我们最近遇到了几种情况,需要从已经有API的外部系统获取信息,以便通过web服务公开数据。
通常的方法是编写脚本或使用ETL,但这些选项有一些缺点:
提供过时的数据,除非经常计划,但它会创建工作负载以刷新可能未使用的数据集难以从SAP HANA传递参数和控制
通过SAP HANA SDI中的数据联合,我们可以创建虚拟表,这意味着它们可以像常规表一样进行操作或使用,但实际上没有存储任何数据。当查询引用虚拟表时,数据由连接到源系统的代理发送。
在下面的示例中,我们将创建一个由5列组成的虚拟表,在每个查询中由来自web服务的内容填充。
SAP HANA SDI SDK提供了通过一个接口实现任何处理和格式化逻辑的能力数据库级别,使其无缝嵌入到视图、odata服务或任何HANA数据库工件中。
与往常一样,淘客大玩家,文档总是一个很好的起点,什么是物联网,以及一些以前的博客文章。
分解代码以尽可能减少添加新web服务的工作量
在浏览github上发布的适配器代码之后,它对公开的函数数量有点惊讶,这些函数允许控制适配器行为的大部分方面。我的情况需要从多个web服务收集数据,我不想每次都编写所有必需的适配器函数,因此我编写了一些抽象类来考虑某些任务:
将数据源参数暴露到SAP HANA中的数据配置UI使web服务显示为虚拟表或虚拟函数将行发送到SAP HANA还有一些小任务:初始化一个http客户机,json解析
这是一个有用的类图,适配器基类一些创建工作适配器必须实现的方法:
这两条虚线代表类继承。因此,对于每个web服务功能,有三个部分需要编写:
公共web服务器上托管文件的示例
以下是一个没有版权的数据源的示例,客户需要从SEC网站上公开的公司文件中获取一些财务信息。
有一个名为主索引的文件,定期更新。而不是编写下载、转换和导入文件的脚本,我们将使文件的内容作为数据库表提供。
内容从11行标题开始,然后用管道将值分隔:
我们将调用此webservice SED Edgar Master
我们在SECEdgarMasterService中实现抽象类WebserviceConfig。在这种情况下,没有输入参数,服务器云服务,我们只是将webservice定义为一个由5列组成的虚拟表。
我们在SECEdgarMasterRequest中实现了抽象类webservicequesthandler。它包括打开URL并将结果作为CloseableHttpResponse返回
我们在SECEdgarMasterResponse中实现了抽象类WebserviceResponseHandler。它逐行使用http请求的输出。跳过头之后,它将构建一个记录列表并返回它。然后WebserviceAdapter类将处理将记录批量发送到SAP HANA的操作。
内部类SecedGamasterRecord必须实现方法"appendTo",该方法被调用以将记录发送到SAP HANA。
结果
这就是编码!然后构建适配器,大数据行业分析,将jar作为自定义适配器部署在现有的数据供应代理上,并在saphana中注册适配器。当浏览与适配器相关联的远程源时,我们可以看到4个作为虚拟表公开的Web服务,包括我们的示例表。
然后我们创建一个指向SEC\u EDGAR\u MASTER表的虚拟表,我们可以开始探索表的内容。
获取虚拟表的第一行需要3秒钟,然后获取所有227000行都需要3.2秒。
结论
将底层方法抽象为几个类后,为web服务开发数据库接口相当容易。我们只使用SAP HANA和一个数据供应代理来呈现数据,没有ETL,什么叫物联网,没有调度和平面文件导入。
在将来,我可能会发布另一个适配器,一个使用输入参数的更高级的适配器。
所有源文件都在github上