【问题标题】:How to get sum of product from columns in 2 data frame using PySpark如何使用 PySpark 从 2 个数据框中的列中获取产品总和
【发布时间】:2021-05-23 23:30:40
【问题描述】:

有 2 个数据框,其中一个包含价格信息如下(第 1 天到第 100 天为 100 行),

 StoreId,ItemID, Date,Price
  HH-101,item1, d_1,      €9
  HH-101,item1, d_2,      €7
  ……………………………
  DH-101,item1, d_90,     €4
  ……………………………

  HH-101,item1, d_100,    €3

第二个数据框是一个销售信息,如图所示(第 1 天到第 100 天为 100 列但 1 行)

Stored_ID, ItemID,   d-1, d-2, d-3,……. d-90,d-100
HH-101     , item1  , 2 , 4  , 0,………..,12  ,22
HH-101     , item2  , 1 , 0  , 3 ……………,3   ,3

生成另一个数据框的最佳 PySpark 脚本是什么

新列,总和为

件数*销售价格,对应每件

  example for store HH-101 and  item1
  
      2*9+ 4*7+........+.....+...12*4+22*3

是否有任何单个步骤而不是为超过 100 列写入产品总和

【问题讨论】:

    标签: python scala dataframe apache-spark pyspark


    【解决方案1】:

    这是一个从您的示例数据框派生的更简单的示例。我认为它还应该可以扩展到您的真实数据。

    df1.show()
    +-------+------+----+-----+
    |StoreId|ItemID|Date|Price|
    +-------+------+----+-----+
    | HH-101| item1| d_1|   €9|
    | HH-101| item1| d_2|   €7|
    +-------+------+----+-----+
    
    df2.show()
    +-------+------+---+---+
    |StoreId|ItemID|d_1|d_2|
    +-------+------+---+---+
    | HH-101| item1|  2|  4|
    | HH-101| item2|  1|  0|
    +-------+------+---+---+
    

    您可以使用stackdf2 与从列名的列表理解生成的查询字符串一起取消旋转df2,然后使用前3 列连接到df1,按商店ID 和项目ID 分组,并获取price * number 的总和。

    result = df2.selectExpr(
        'StoreId', 'ItemID',
        'stack(2, ' + ', '.join(["'%s', %s" % (c, c) for c in df2.columns[2:]]) + ') as (Date, Number)'
        # "stack(2, 'd_1', d_1, 'd_2', d_2) as (Date, Number)"
    ).join(
        df1, df1.columns[:3]
    ).groupBy(
        'StoreId', 'ItemID'
    ).agg(
        F.expr('sum(Number * float(substr(Price, 2))) as Total')
    )
    
    result.show()
    +-------+------+-----+
    |StoreId|ItemID|Total|
    +-------+------+-----+
    | HH-101| item1| 46.0|
    +-------+------+-----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多