PredictionIO使用PHP的SDK收集数据

PredictionIO 安装:http://php2012web.blog.51cto.com/5585213/1631301

官方收集数据文档地址:https://docs.prediction.io/datacollection/eventapi/

https://docs.prediction.io/templates/recommendation/quickstart/

PredictionIO收集数据支持:Python,PHP,Ruby,Java,REST(API);其中 TEST 是原生接口(即直接通过URL地址访问服务器API)。

PredictionIO收集数据需要创建一个应用(类似数据库中创建一个库)。

进入PredictionIO安装目录;

或者把PredictionIO加载到系统PATH中

PATH=$PATH:/PredictionIO安装目录/bin; export PATH

PredictionIO数据收集应用是通过事件服务器 eventserver 接收,然后存储(默认使用Apache HBase作为数据存储),所以要正常使用API必需启动 eventserver服务,当然通过 pio-start-all 默认所有相关服务都会启动,无需使用下面的命令再次启动。

启动eventserver事件服务器:

pio eventserver [--ip <value>] [--port <value>] [--stats]

参数 --ip 是指定访问IP地址,默认为localhost。

--port 是指定访问端口号,默认为 7070。

--stats  是查看状态

创建应用

pio app new MyAppName

如:

[[email protected] /]# pio app new user
[WARN] [NativeCodeLoader] Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[INFO] [HBLEvents] The table predictionio_eventdata:events_2 doesn‘t exist yet. Creating now...
[INFO] [App$] Initialized Event Store for this app ID: 2.
[INFO] [App$] Created new app:
[INFO] [App$]       Name: user
[INFO] [App$]         ID: 2
[INFO] [App$] Access Key: 1rqDilLgSOjVIKI2SAiLSIsHecSHfq4b0KrGRh8RAbIcXL8dpjOwyTIgxEs6QiU1

注意:MyAppName 是当前应用的名称(类似数据库的库名),在SDK中 Name 与 Access Key是会使用到。

查看所有应用

[[email protected] /]# pio app list
[INFO] [App$]                 Name |   ID |                                                       Access Key | Allowed Event(s)
[INFO] [App$]                 user |    1 | 1rqDilLgSOjVIKI2SAiLSIsHecSHfq4b0KrGRh8RAbIcXL8dpjOwyTIgxEs6QiU1 | (all)
[INFO] [App$] Finished listing 1 app(s).

删除应用

pio app delete MyAppName

只删除应用数据

pio app data-delete MyAppName

如:

[[email protected] /]# pio app data-delete user
[INFO] [App$] The data of the following app will be deleted. Are you sure?
[INFO] [App$]     App Name: user
[INFO] [App$]       App ID: 1
[INFO] [App$]  Description: None
Enter ‘YES‘ to proceed: YES
[WARN] [NativeCodeLoader] Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[INFO] [HBLEvents] Removing table predictionio_eventdata:events_2...
[INFO] [App$] Removed Event Store for this app ID: 2
[INFO] [HBLEvents] The table predictionio_eventdata:events_2 doesn‘t exist yet. Creating now...
[INFO] [App$] Initialized Event Store for this app ID: 2.
[INFO] [App$] Done.

注意:中间会要求确认操作,输入YES一定要大写。

eventserver事件服务器API:

API访问地址: http://localhost:7070/events.json?accessKey=yourAccessKeyString

yourAccessKeyString 是访问应用的 Access Key 值,当PHP SDK不能正常访问时,可以直接在浏览器中打开对应的API地址,查看服务器是否正常。

API参数:(所有名称的避开使用 $或 pio_ 开头,如"$set"或"pio_set",红色的参数名是要注意的,参数是以POST方式操作)

参数名 数据类型 要求 功能说明
event 字符串 必需 事件名称或特殊事件名
entityType 字符串 必需 实体类型(类似关系数据库的表名)
entityId 字符串 必需 实体ID(类似关系数据库的ID,必需保证唯一)
targetEntityType 字符串 可选 与之关联的实体类型
targetEntityId 字符串 可选 与之关系实体类型ID(类似关系数据库的关联ID)
properties JSON 可选 该记录的相关所有属性集,以【名/值】对形式存在。
eventTime 字符串 可选
记录生成时间,默认是服务器当前时间,实际应用中最好直接这个时间。必需以ISO 8601格式

(如 2004-12-13T21:39:45.618Z,或2014-09-09T16:17:42.937-08:00)

PHP SDK 安装包及规范文档:https://packagist.org/packages/predictionio/predictionio

GIT库地址:

规范文档:https://github.com/PredictionIO/PredictionIO-PHP-SDK.git

安装包:https://github.com/PredictionIO/PredictionIO-PHP-SDK/tree/master

要求:

git ,php>=5.4.0 ,composer

PredictionIO 需要PHP的 cURL 扩展,编译时需要添加 --with-curl[=DIR] 选项([=DIR]是指定libcurl安装目录需要包含lib和include的目录路径。在include目录中必须有一个名为curl,包含了easy.h和curl.h的文件夹。lib文件夹里应该有一个名为libcurl.a的文件)。如果没有指定libcurl安装目录,则使用默认安装目录。

安装使用composer 需要PHP的openssl扩展,编译时需要添加 --with-openssl[=DIR] 选项。

PHP部分./configure时缺失包报错:

checking for cURL in default path... not found
configure: error: Please reinstall the libcurl distribution -
easy.h should be in /include/curl/

缺少  curl-devel

checking libxml2 install dir... no
checking for xml2-config path... 
configure: error: xml2-config not found. Please check your libxml2 installation.

缺少  libxml2-devel

checking for RAND_egd... no
checking for pkg-config... /usr/bin/pkg-config
configure: error: Cannot find OpenSSL‘s <evp.h>

缺少  openssl-devel

安装git: http://git-scm.com/downloads

或者直接使用

yum install git

安装composer:(composer 是基于PHP的一个脚本程序)

下载地址:https://getcomposer.org/

安装:

curl -sS https://getcomposer.org/installer | php

php -r "readfile(‘https://getcomposer.org/installer‘);" | php

如果报如下类似错误:

curl: (56) SSL read: errno -5961
Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T_END_HEREDOC) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in - on line 885

则可以先下载再执行安装:

wget https://getcomposer.org/installer
chmod 777 installer
./installer

如果报如下类似错误:

Download failed: file_get_contents(https://getcomposer.org/composer.phar): failed to open stream: HTTP request failed!

那就手动下载

wget https://getcomposer.org/composer.phar

说明:其实composer就是名为composer.phar一个PHP脚本程序,所谓的安装只是把这个脚本文件给下载出来。官方网站上说的局部安装则是把这个脚本文件下载到对应的待处理依赖包(含有composer.json文件)目录下再执行这个脚本,而全局安装则是把这个脚本添加到系统的PATH目录下,好让这个脚本在任意地方调用而时不受脚本所在目录影响。

全局处理可有多种方式:

例:

永久生效:(把composer直接移动到PHP的默认安装启动目录下,当然也可以指定到其它PATH目录)

mv composer.phar /usr/local/bin/composer

临时生效:(把composer追加到当前终端PATH目录中,当这个终端关闭后,操作失效,即无法再任意地方调用composer,注意composer得先修改下文件名,/var/composer/bin是composer所在目录)

mv composer.phar composer
PATH=$PATH:/var/composer/bin;export PATH

注意:全局方式安装只是针对会多次使用到composer时提供一种方便,而不用每次使用composer都要下载composer.phar或移动到待依赖处理包所在目录下;而局部方式则是针对使用次数少时的一种临时处理方案,用完就不要,或者保存起来,下次用再复制过去。

下载PHP SDK包:(这个包下载后不能直接使用,必需使用composer处理依赖并下载对应的文件)

git clone https://github.com/PredictionIO/PredictionIO-PHP-SDK /var/tmp/sdk

SDK包依赖处理:

进入SDK下载所在目录

根据安装composer的方式,选择下载依赖文件:(局部处理方式,必需先下载composer.phar到当前SDK目录下)

php composer.phar install

或(全局处理方式)

composer install

注意:处理依赖会下载一批php文件,有时会因为网络问题报错,只能再重新调用依赖安装命令。

如下类似错,大部分是网络异常,下载文件失败。可以手动查看下对应的文件是否能成功下载。

  [Composer\Repository\RepositorySecurityException]                            
  The contents of https://packagist.org/p/provider-latest$62dd7ff0a317764ec6e  
  27022b357464cbbf1275096f9028d1b0a03925c845ac2.json do not match its signatu  
  re. This should indicate a man-in-the-middle attack. Try running composer a  
  gain and report this if you think it is a mistake.

PHP SDK收集数据(在PHP SDK安装包目录下)

创建收集文件(收集使用SDK的 EventClient 对象)

vim user.php

写入代码:(收集数据,是尽可能多收集,以便后续使用)

注意:Access Key的值需要与当前创建应用相同,可以使用 pio app list 查看

/*   加载自动加载文件,
 *   命名空间与目录对应列表:(以当前PHP SDK安装目录为根目录)
 *   predictionio         /src/predictionio
 *   React\Promise        /vendor/react/promise/src
 *   GuzzleHttp\Stream    /vendor/guzzlehttp/streams/src
 *   GuzzleHttp\Ring      /vendor/guzzlehttp/ringphp/src
 *   GuzzleHttp           /vendor/guzzlehttp/guzzle/src
 *   
 * 注意:默认在/src/predictionio 目录下生成的 EventClient.php 只是添加部分功能,实际应用中可以去扩展这个文件。
*/
require_once("vendor/autoload.php");

use predictionio\EventClient;

//创建应用事件客户端对象,注意第一个参数是PredictionIO生成应用的Access Key ,第二个参数是访问API的地址(可以不传默认是本地,端口号是7070)。
$client = new EventClient(‘1rqDilLgSOjVIKI2SAiLSIsHecSHfq4b0KrGRh8RAbIcXL8dpjOwyTIgxEs6QiU1‘,‘http://127.0.0.1:7070‘);

// 用户行为
$client->createEvent(array(
   ‘event‘ => ‘user‘,                //应用名(pio app new MyAppName 中的MyAppName)
   ‘entityType‘ => ‘action‘,         //实体类型,类似表名,可以根据需求定义。
   ‘entityId‘ => 121,                //这条记录的ID值,最好保证唯一。
   ‘targetEntityType‘ => ‘entity‘,   //关联实体类型,类似关联表名。
   ‘targetEntityId‘ => 1,            //关联实体类型的ID,类似关联表记录的ID
   ‘properties‘ => array(            //该记录的数据体,根据实际要求添加,尽可能的多收集标识。
       ‘url‘=> ‘http://PredictionIO.com/‘,
       ‘referer‘=> ‘http://PredictionIO.com/list/‘,
       ‘platform‘=> ‘pc‘,
       )
));

// 用户数据
$client->createEvent(array(
   ‘event‘ => ‘user‘,                //应用名
   ‘entityType‘ => ‘entity‘,         //实体类型,即表名。
   ‘entityId‘ => 1,                  //实体类型记录ID。
   ‘properties‘ => array(            //该记录的数据体。
       ‘name‘=> ‘张三‘,
       ‘age‘=> ‘15‘,
       ‘sex‘=> ‘男‘,
       )
));

保存后通过PHP命令行运行:

php user.php

如果报如下错:(可以重新启动下PredictionIO,可以查看:https://docs.prediction.io/resources/faq/

Fatal error: Uncaught exception ‘predictionio\PredictionIOAPIError‘ with message ‘Client error response [url] http://127.0.0.1:7070/events.json?accessKey=1rqDilLgSOjVIKI2SAiLSIsHecSHfq4b0KrGRh8RAbIcXL8dpjOwyTIgxEs6QiU1 [status code] 401 [reason phrase] Unauthorized‘ in /var/tmp/sdk/src/predictionio/BaseClient.php:59
Stack trace:
#0 /var/tmp/sdk/src/predictionio/EventClient.php(249): predictionio\BaseClient->sendRequest(‘POST‘, ‘/events.json?ac...‘, ‘{"event":"user"...‘)
#1 /var/tmp/sdk/test.php(31): predictionio\EventClient->createEvent(Array)
#2 {main}
  thrown in /var/tmp/sdk/src/predictionio/BaseClient.php on line 59

其它错误可以检查下PHP版本,curl扩展等是否达到要求。

收集数据调试(这些功能并不包含在SDK中)

查看是所有当前应用数据命令:(注意 accessKey 是所创建应用的 access Key 值)

curl -i -X GET http://localhost:7070/events.json?accessKey=1rqDilLgSOjVIKI2SAiLSIsHecSHfq4b0KrGRh8RAbIcXL8dpjOwyTIgxEs6QiU1

正确的结果:

HTTP/1.1 200 OK
Server: spray-can/1.3.2
Date: Wed, 06 May 2015 07:15:32 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 594

[{"eventId":"rhfb-lPDpW1R6kTf14pTiQAAAU0oEv2ygw0_hXPBpTY","event":"user","entityType":"entity","entityId":"1","properties":{"name":"张三","age":"15","sex":"男"},"eventTime":"2015-05-06T07:14:02.802Z","creationTime":"2015-05-06T07:14:02.802Z"},
{"eventId":"2cmHXLcgockKGfq9gVNRPAAAAU0oEvrQlk0XBQuon0Q","event":"user","entityType":"action","entityId":"121","targetEntityType":"entity","targetEntityId":"1","properties":{"url":"http://PredictionIO.com/","referer":"http://PredictionIO.com/list/","platform":"pc"},"eventTime":"2015-05-06T07:14:02.064Z","creationTime":"2015-05-06T07:14:02.064Z"}]

查看指定事件数据命令:(注意:<eventId>是要查询的事件ID,通过上面的命令中可以得到对应的事件ID,accessKey 同上)

curl -i -X GET http://localhost:7070/events/<eventId>.json?accessKey=1rqDilLgSOjVIKI2SAiLSIsHecSHfq4b0KrGRh8RAbIcXL8dpjOwyTIgxEs6QiU1

如:

curl -i -X GET http://localhost:7070/events/rhfb-lPDpW1R6kTf14pTiQAAAU0oEv2ygw0_hXPBpTY.json?accessKey=1rqDilLgSOjVIKI2SAiLSIsHecSHfq4b0KrGRh8RAbIcXL8dpjOwyTIgxEs6QiU1

删除指定事件数据命令:(注意删除与查询事件数据只是请求方式不同,一个是GET一个是DELETE,参数均相同)

curl -i -X DELETE http://localhost:7070/events/<eventId>.json?accessKey=1rqDilLgSOjVIKI2SAiLSIsHecSHfq4b0KrGRh8RAbIcXL8dpjOwyTIgxEs6QiU1

其它API参数列表:

startTime   开始时间,ISO8601格式。过滤条件为 eventTime>=startTime。

untilTime   指定时间以前,ISO8601格式。过滤条件为 eventTime<untilTime。

entityType  指定实体类型。

entityId    指定实体ID

limit       限制提取记录数,默认为20

reversed    默认是false (从小到大,以creationTime时间记录)

例如:(注意在命令行中参数出现 & 符号时这个参数必需加引号)

curl -i -X GET "http://localhost:7070/events.json?accessKey=1rqDilLgSOjVIKI2SAiLSIsHecSHfq4b0KrGRh8RAbIcXL8dpjOwyTIgxEs6QiU1&reversed=true&entityType=user&entityId=1"
时间: 2024-10-06 16:12:50

PredictionIO使用PHP的SDK收集数据的相关文章

java 每日习题(六)从文件收集数据记录到mysql

1. mysql建库,建表 2. 准备数据文件cpu.txt 1447836374319,169,0,01447836375346,498,0,01447836376346,250,0,01447836377347,0,0,01447836378347,497,0,01447836379347,0,0,01447836380347,498,0,01447836381348,0,0,01447836382348,498,0,01447836383348,0,0,01447836384348,248

10种令人吃惊的方式你的日常生活中正在收集数据的大数据野兽

10种令人吃惊的方式你的日常生活中正在收集数据的大数据野兽 原文:http://www.bloomberg.com/slideshow/2014-06-03/10-surprising-ways-your-daily-life-is-feeding-the-big-data-beast.html 无处可逃 大数据是你日常生活中,无论你喜欢与否的重要组成部分 - 甚至是意识到这一点. 当你去看医生.去到你的手机上工作或获得方向,有一个非常好的机会,有软件在那里悄悄地收集和分析这些信息. 并依据不同

《决战大数据》读书笔记(一) 收集数据和使用数据要有关联

亚马逊图书买200减120,买了一堆书.第一本开始阅读的就是这本<决战大数据>. 这本书没有什么理论,定义之类的描述,基本都是个人经验和感悟,全是干货,十分适合不愿意看枯燥课本的同学.要说缺点就是,逻辑性不太清晰,更像是长者在叙事性地娓娓道来,倒是挺适合技术人员看的. 目前大数据很火,但是真正能理解其中的奥妙,能正确熟练地使用大数据的人和企业却很少. “收集数据的人不知道数据可以做什么用,使用数据的人不知道数据的来源” 这样的断层,导致数据的收集没有章法没有预见没有灵魂,而数据的使用充满了疑问

10种令人惊讶的方式你的日常生活中正在收集数据的大数据野兽

10种令人惊讶的方式你的日常生活中正在收集数据的大数据野兽 原文:http://www.bloomberg.com/slideshow/2014-06-03/10-surprising-ways-your-daily-life-is-feeding-the-big-data-beast.html 无处可逃 大数据是你日常生活中,不管你喜欢与否的重要组成部分 - 甚至是意识到这一点. 当你去看医生,去到你的手机上工作或获得方向,有一个很好的机会,有软件在那里悄悄地收集和分析这些信息.并根据不同的情

Java 8 (5) Stream 流 - 收集数据

在前面已经使用过collect终端操作了,主要是用来把Stream中的所有元素结合成一个List,在本章中,你会发现collect是一个归约操作,就像reduce一样可以接受各种做法作为参数,将流中的元素累计成一个汇总结果. 看这个例子:按照菜类进行分组 List<Dish> menu = Arrays.asList( new Dish("猪肉炖粉条", false, 800, Type.MEAT), new Dish("小炒牛肉", false, 70

使用Azure Monitor从Azure VM收集数据

相信大家都知道,在我们日常运维的过程中,对系统的监控是必不可少的.通过监控我们能够了解到系统资源的使用状况如网络吞吐量,磁盘使用率以及系统的某些服务是否处于running状态,以便于在适当的时候采取相应的措施.那今天我们就来看一下如何使用Azure Monitor从Azure虚拟机收集logs和metrics数据.若要使用Azure Monitor收集在Azure中运行的虚拟机的性能和日志数据,我么可以对其安装Log Analytics Agent,通过Log Analytics Agent将A

收集数据至泛型Dictionary

开发时,我们经常使用到泛型,不管是List<T>,还是Dictionary<T,V>,下面Insus.NET在测试一些功能,当使用到一些临时数据集时,有好几种方法把数据收集至Dictionary<T,V>中,你可以参考: 比如我们有一个类: 一,你会这样写,运用最普能的方法,把数据填入Dictionary中去. 二,创建一个私有方法: 三,对Item作一些少变化: 四, 五,写一个索引器: 六: 一些少的总结,以备忘记.

Java8-用流收集数据(1)

在这之前,我们用过了collect终端操作了,当时主要是用来把Stream中所有的元素结合成一个List.在这里,你会发现collect是一个归约操作,就像reduce一样可以接收各种做法作为参数,将流中的累积成汇总结果.具体的做法是通过定义新的Collector接口来定义的,因此区分Collection.Collector和collect是很重要的. 激动吗?很好,我们先来看一个例利用收集器的例子.想象一下,你有一个Transaction的构成的List,并且想按照货币种类进行分组.在没有La

【Java8实战】使用流收集数据

在上一节中,我们了解到终端操作collect方法用于收集流中的元素,并放到不同类型的结果中,比如List.Set或者Map.其实collect方法可以接受各种Collectors接口的静态方法作为参数来实现更为强大的规约操作,比如查找最大值最小值,汇总,分区和分组等等. 准备工作 为了演示Collectors接口中的静态方法使用,这里创建一个Dish类(菜谱类): public class Dish {   public enum Type {MEAT, FISH, OTHER}?   /**