阿里雲推薦引擎使用調查記錄

最近項目中須要使用到推薦引擎,直接選用的是阿里雲推薦引擎。因爲一開始都沒涉及過這方面的知識,並且調查時正好是V3發佈前,調查到一半的時候,推薦引擎發佈了最新V3版本,DDL和V2的略有不一樣。在調查與開發過程當中踩了很多的坑,這裏總結下。css

首先最有感觸的就是阿里的工單真好用,回覆的效率仍是很高的,基本上當天就能獲得有效的回覆。因此開發中不少問題和解決方法都是從諮詢客服中獲取的。html

一、已得知的基礎情報java

1、推薦模塊下的api調用目前官方沒有提供SDK,須要本身使用API進行調用。
2、大數據模塊下的官方提供了SDK,地址:https://help.aliyun.com/document_detail/34614.html
3、一個project實際上是一個數據庫資源,爲不一樣的業務提供基礎數據
4、業務依賴依賴數據庫資源,不一樣場景能夠選擇不一樣算法
5、SDK使用說明:https://help.aliyun.com/document_detail/34614.html
6、API調用demo:https://help.aliyun.com/document_detail/30245.html
7、在推薦引擎管理後臺上,能夠編寫腳本和啓動定時任務,目前還麼使用到

二、踩坑點算法

1、demo上用的是V2版本的數據和DDL,咱們使用V3版本的DDL進行初始化,算法任務死活是失敗的。
2、V3版本剛發佈時,算法任務失敗log是看不到的,老是提示隊列處理中。沒辦法,項目比較緊急,只能選用V2版本進行開發。
3、使用SDK上傳數據的時候,覺得只須要把須要用到的字段傳入數據便可,測試後發現數據導入的字段不對。須要把表結構上的全部字段按順序定義出來,而後再根據字段名稱進行賦值

如下爲使用到的基本代碼,部分從官方文檔中獲取,部分是諮詢客服獲取到的。
一、初始化API帳號數據sql

Account account = new AliyunAccount(accessId, accessKey);
            Odps odps = new Odps(account);
            odps.setEndpoint(endPoint);
            odps.setDefaultProject(project);

            TableTunnel tunnel = new TableTunnel(odps);
            tunnel.setEndpoint("http://dt.odps.aliyun.com");
從官網:https://help.aliyun.com/document_detail/30245.html 中獲取的代碼片斷

二、判斷分區是否存在,不存在則創建分區數據庫

public boolean createPartitionIfNeed(String dsDate, Odps odps, String table) throws OdpsException {
            Tables tbs = odps.tables();
            Table t = tbs.get(table);
            String partition = "ds=" + dsDate;
            PartitionSpec partitionSpec = new PartitionSpec(partition);

            boolean partitionExists = false;
            for (Partition p : t.getPartitions()) {
                  if (StringUtils.equals(p.getPartitionSpec().get("ds"), dsDate)) {
                        partitionExists = true;
                        break;
                  }
            }

            if (!partitionExists) {
                  logger.info("分區{}不存在,新建分區!", dsDate);
                  t.createPartition(partitionSpec);
                  logger.info("分區{}不存在,新建分區成功!", dsDate);
            }

            return !partitionExists;
      }

三、啓動數據預處理任務
四、啓動離線算法任務
五、查詢任務狀態api

目前官方沒有提供SDK,須要經過API調用

六、執行SQL,從dual表中獲取數據markdown

public class RecTest {
    private static final String accessId = "";
    private static final String accessKey = "";
    private static final String endPoint = "http://service.odps.aliyun.com/api";
    private static final String project = "myproject";
    private static final String ct = "20170624";
    private static final String sql = "INSERT OVERWRITE TABLE demo.demo_user_meta PARTITION (ds="+ ct +") SELECT x ,null FROM demo.dual_demo WHERE x = '20170620';";

    public static void main(String[] args) {
        Account account = new AliyunAccount(accessId, accessKey);
        Odps odps = new Odps(account);
        odps.setEndpoint(endPoint);
        odps.setDefaultProject(project);
        Instance i;
        try {
            i = SQLTask.run(odps, sql);
            i.waitForSuccess();
            List<Record> records = SQLTask.getResult(i);
            for (Record r : records) {
                System.out.println(r.get(0).toString());
            }
        } catch (OdpsException e) {
            e.printStackTrace();
        }
    }
}

七、上傳數據測試

UploadSession uploadSession = tunnel.createUploadSession(project, table, new PartitionSpec("ds=20170623"));
            RecordWriter recordWriter = uploadSession.openRecordWriter(0);

            String date = "20170623";

            for (int i = 0; i < 60; i++) {
                  //這裏須要注意,須要把表結構下的全部字段按表結構順序定義出來,不然會出現數據導到其餘字段中去的狀況
                  Record record = new ArrayRecord(new Column[] { new Column("item_id", OdpsType.STRING), new Column("ds", OdpsType.STRING),
                              new Column("category", OdpsType.STRING) });
                  record.set("item_id", "itemid_1" + i);
                  record.set("ds", date);
                  record.set("category", "category" + i);
                  recordWriter.write(record);
            }


            recordWriter.close();

            long id = uploadSession.getAvailBlockId();

            uploadSession.commit(new Long[] { id });

八、獲取表數據大數據

DownloadSession downloadSession = tunnel.createDownloadSession(project, table, new PartitionSpec("ds=20170623"));
            long count = downloadSession.getRecordCount();
            RecordReader recordReader = downloadSession.openRecordReader(0, count);
            Record record;

            while ((record = recordReader.read()) != null) {
                  int colCount = record.getColumnCount();

                  for (int i = 0; i < colCount; i++) {
                        System.out.print(record.get(i) + ",");
                  }
                  System.out.println();
            }

            recordReader.close();

            System.out.println("總數量爲:" + count);

經過以上的接口功能,推薦功能的基本步驟以下: 一、同過SDK上傳完用戶基本數據和行爲數據 二、 調用API啓動數據預處理任務,獲取到任務id 三、根據任務id判斷數據預處理是否成功 四、數據預處理成功後調用API啓動離線算法,獲取到任務id 五、根據步驟4獲取到的任務id,判斷離線算法是否處理成功

相關文章
相關標籤/搜索