Pyspark:有没有一种方法可以通过将多行合并为一个来创建汇总表(或数据框)?

时间:2020-02-03 01:24:27

标签: python apache-spark pyspark pyspark-sql pyspark-dataframes

我通过解析Spark中的多个CSV创建了以下数据框。我需要对每个城市每个SKU每年每个月的平均销售额进行分组。

<table><tbody><tr><th>city</th><th>sku_id</th><th>year</th><th>month</th><th>avg_sales</th></tr><tr><td>A</td><td>SKU1</td><td>2017</td><td>Jan</td><td>100</td></tr><tr><td>A</td><td>SKU1</td><td>2017</td><td>Feb</td><td>120</td></tr><tr><td>..</td><td>..</td><td>..</td><td>..</td><td>..</td></tr><tr><td>Z</td><td>SKU100</td><td>2019</td><td>Dec</td><td>99</td></tr></tbody></table>

所需的输出:

<table><tbody><tr><th>city</th><th>sku_id</th><th>year</th><th>Jan_avg_sales</th><th>Feb_avg_sales</th><th>..</th><th>Dec_avg_sales</th></tr><tr><td>A</td><td>SKU1</td><td>2017</td><td>100</td><td>120</td><td>..</td><td>320</td></tr><tr><td>A</td><td>SKU1</td><td>2017</td><td>98</td><td>118</td><td>..</td><td>318</td></tr><tr><td>..</td><td>..</td><td>..</td><td>..</td><td>..</td><td>..</td><td>..</td></tr><tr><td>Z</td><td>SKU100</td><td>2019</td><td>99</td><td>114</td><td>..</td><td>314</td></tr></tbody></table>

我已经使用python字典实现了摘要表的创建,但是我不相信该解决方案。

这是到目前为止我尝试过的代码片段: 路径=“ s3a:// bucket / city1 *” cleaned_df = spark.read.format('csv')。options(header ='true',inferSchema ='true')。load(路径) cleaned_df = cleaned_df.groupby(['Year','city','sku_id'])。mean() cleaned_df.coalesce(1).write.format(“ com.databricks.spark.csv”)。option(“ header”,“ true”)。save(“ mydata4csv”)

2 个答案:

答案 0 :(得分:0)

如果您的数据框看起来像:

   avg_sales city sku_id  year
0        300    A   sku1  2017
1        210    A   sku1  2018
2        200    A   sku2  2017
3         10    A   sku2  2017
4         10    B   sku1  2017
5        190    B   sku1  2017
6        130    B   sku2  2017
7        130    B   sku2  2017
8         50    C   sku2  2017

然后您可以做:

dataframe.groupby(['year', 'city', 'sku']).mean()

并获得:

                  avg_sales
city sku_id year           
A    sku1   2017        300
            2018        210
     sku2   2017        105
B    sku1   2017        100
     sku2   2017        130
C    sku2   2017         50

如果您共享python代码,我可以修改答案以适合您的情况。

答案 1 :(得分:0)

您是否尝试根据三个属性(城市,SKU,年份)对它们进行分组?