Spark聚合 - 嵌套组

时间:2017-01-05 02:16:25

标签: mongodb scala apache-spark intellij-idea aggregation-framework

需要有关嵌套分组的帮助。非常新的火花和斯卡拉。感谢您的专家建议。

我正在使用spark进行mongo集合的转换。我正在使用IntelliJ-Idea。以下是收集详情:

{
_id:
customer:
product:
location:
date:
transType:
}

使用案例:对于每个产品'并且对于具有交易类型'已订购的客户的每个位置。

//输出类似这样的内容

        {
        Product: ABCD
          location: North america
            customer: Cust 1, type: ordered
              total: 200
       }
       {
        Product: EFGH
          location: North america
            customer: Cust 2, type: Ordered
               total: 300
}

这是我到目前为止所做的:

val conf = new SparkConf().setAppName("PVL").setMaster("local").
      set("spark.mongodb.input.uri","mongodb://127.0.0.1:27017/product.transactionEvent").
      set("spark.mongodb.output.uri", "mongodb://127.0.0.1:27017/product.transctionResult")
    val sc = new SparkContext(conf)

val rdd = sc.loadFromMongoDB()
val aggRdd = rdd.withPipeline(Seq(
      Document.parse("{$match: {transType: 'ordered'}}"),
      Document.parse("""{ $group: {_id: {prodId: "$prodId", customer: "$customer", location: "$location", Transtype: "$Transtype"}, total: {$sum:1}}}"""),
      Document.parse("""{$group: {_Id: {prodId: "$_id.prodId"}, details: {$addToSet: {customer: "$_id.customer", location: "$_id.location", transType: "$_id.transType", total: "$total"}}}}""")))

但由于某种原因,这不起作用。错误是:

  

'未知的群组运营商' prodId''在服务器上

首先,是否可以在火花中进行这种嵌套?如果是的话,我做错了什么? 非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

我知道问题是什么。在$ group语句之一中,我有_id大写(如_Id)。一旦我删除它,它工作正常。

简而言之:像unknown group operator<field> should be inside the object这样的错误意味着,代码无法识别群组运营商/字段。原因可能是:

  1. 组_id中的主要字段可以大写
  2. 缺少逗号
  3. 没有为组字段声明组操作符
  4. 等。
  5. 因此,请检查您的代码是否存在这些错误。

    由于