Jcascalog用于查询HDFS上的thrift数据

时间:2015-06-10 16:09:56

标签: hadoop hdfs thrift cascalog lambda-architecture

我在lambda架构上读过Nathan Marz的书。 我实际上是在证明这个解决方案的概念。

我很难构建我的Jcascalog查询。

这是我感兴趣的节俭模式的一部分:

  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")
          );

我用Pail将一些数据存储到文件夹:/ home / tickets

现在我想对这些数据发出请求:我希望按文章名称获取数量分组的总和。 所以首先我需要得到名字,然后是数量。对于每一个我都可以获得文章的ID。

例如,我将为名称请求(id_article,name)提供此结果: (1,意大利面) - (2,pasta2) - (3,意大利面)

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

{{1}}

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

1 个答案:

答案 0 :(得分: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);