2015-06-10 85 views
1

我在lambda体系结构上阅读了Nathan Marz的书。 我实际上正在对此解决方案进行概念验证。Jcascalog查询HDFS上的节俭数据

我难以构建我的Jcascalog查询。

这是我们感兴趣的那块我节俭架构:

union ArticlePropertyValue { 
    1: decimal quantity, 
    2: string name; 
} 

union ArticleID { 
    1: int id; 
} 

struct ArticleProperty { 
    1: required ArticleID id; 
    2: required ArticlePropertyValue property; 
} 

union DataUnit { 
    1: TicketProperty ticket_property; 
    2: ArticleProperty article_property; 
} 

我存储与桶一些数据的文件夹:/家庭/票

现在,我想就这个请求数据:我想通过文章名称获得数量分组的总和。因此,首先我需要获取名称和数量。对于每个我可以得到文章的ID。

例如,我将具有该结果的名称请求(id_article,名): (1,面食) - (2,pasta2) - (3,面食)

对于量请求( id_article,数量): (1,2) - (2,1) - (3,1)

Tap source = splitDataTap("/home/florian/Workspace/tickets"); 
    Api.execute(
      new StdoutTap(), 
      new Subquery("?name", "?sum") 
      .predicate(source, "_", "?data") 
      .predicate(new ExtractArticleName(), "?data") 
       .out("?id", "?name") 
      .predicate(new ExtractArticleQuantity(), "?data") 
       .out("?id", "?quantity") 
      .predicate(new Sum(), "?quantity") 
       .out("?sum") 
     ); 

的问题是,我不知道如何合并的结果呢? 如何使用HDFS中的Cascalog和数据进行连接?

回答

0

我猜你想存储这个查询在HDFS的结果,那么你需要做到以下几点:

说的数据将被保存在“/ Data”文件夹,并在简单的文本格式,那么你需要这样做:

Subquery subquery = new Subquery("?name", "?sum") 
      .predicate(source, "_", "?data") 
      .predicate(new ExtractArticleName(), "?data") 
      .out("?id", "?name") 
      .predicate(new ExtractArticleQuantity(), "?data") 
      .out("?id", "?quantity") 
      .predicate(new Sum(), "?quantity") 
      .out("?sum"); 

Api.execute(Api.hfsTextline("/data"), subquery);