如何使用pyspark从2个Dataframe中的列中获得乘积之和

vmpqdwk3  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(454)

有2个Dataframe,其中一个包含如下价格信息(第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列,但只有一行)

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

生成另一个Dataframe的最佳pyspark脚本是什么
具有新列,其总和为
单位数量*销售价格,对应于每个项目

example for store HH-101 and  item1

      2*9+ 4*7+........+.....+...12*4+22*3

对于超过100列的产品,有没有哪一步可以代替产品的总和

yshpjwxd

yshpjwxd1#

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

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|
+-------+------+---+---+

你可以解开它 df2 使用 stack 使用从列名的列表理解生成的查询字符串,然后连接到 df1 使用前3列,按store id和item 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|
+-------+------+-----+

相关问题