【问题标题】:String,Dataset pair in Spark 2.0Spark 2.0 中的字符串、数据集对
【发布时间】:2016-10-10 10:22:05
【问题描述】:

我有一个交易数据集,其中每笔交易代表对单个商品的购买。因此,如果订单包含 3 件商品,则每个订单记录为 3 笔交易。

示例数据集:

User  Order, ItemCount, ItemPrice
1     1      1          10       
1     1      1          10       
1     2      1          30
1     2      1          30       
2     3      1          20
2     3      1          20
3     4      1          15
3     4      1          15                          
3     4      1          15

为了减少我按订单和用户分组的数据集,并聚合了 ItemCount 和 ItemPrice 以获得这样的数据集:

User  Order, ItemCount, OrderAmount
1     1      2          20             
1     2      2          60    
2     3      2          40
3     4      3          45

现在我想按用户对订单进行分组,并对每个用户的订单进行一些分析。 Spark 中有没有办法按用户对订单进行分组,并以一对 > 结尾,其中 User 是用户 ID,Dataset 包含订单?

目前我看到的唯一解决方案是将数据集转换为 rdd 并执行 groupbykey 以获取 rddpair> 然后编写一些代码来对行列表进行分析。

我更喜欢这样的解决方案,我可以将订单作为数据集处理并使用数据集功能进行分析。谁能在这里指出我正确的方向?这可能吗?

我是 spark 新手,并且一直在使用 Spark 和 Java,因为我对 Scala 的经验非常有限,但 Scala 中的示例会有所帮助。

【问题讨论】:

  • 你的预期输出是什么?
  • 预期输出将是单个行(或包含数据的对象),它是每个用户的订单摘要。每个 > 对都应该映射到 UserOrderSummary 对象。
  • 请说明
  • 这个 UserOrderSummary 对象将包含诸如平均订单金额、平均商品数量、订单总数等内容。实际上,该数据集包含有关将在此摘要中使用的每个订单的更多数据,但我的主要问题是知道是否可以按用户对订单进行分组并以我可以执行所有这些操作的数据集结束聚合。
  • 如果您愿意,可以使用 sparkSql 的 groupby 功能!如果我正确理解您的用例,可能会解决您的问题!

标签: java scala apache-spark data-science


【解决方案1】:

只需按userorder 分组并聚合列itemcountitemprice。然后按user 分组并在适当的列中运行所有聚合。

df.groupBy($"User", $"Order").agg(sum($"ItemCount").as("count"),
                                  sum($"ItemPrice").as("total"))
  .groupBy($"User").agg(avg($"total").as("avg_amount"),
                        avg($"count").as("avg_count"),
                        count($"count").as("total_purchases"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2020-07-04
    • 2017-03-28
    • 2016-12-29
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多