Pyspark:有没有办法通过将多行合并为一个来创建摘要 table(或数据框)?
Pyspark: Is there a way to create a Summary table (or dataframe) by merging multiple rows into one?
我通过在 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 词典实现了摘要 table 创建,但我对解决方案不满意。
这是我到目前为止尝试过的代码片段:
路径 = "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")
如果您的数据框如下所示:
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 代码,我可以根据您的情况修改答案。
您是否尝试根据三个属性(城市、SKU、年份)对它们进行分组?
我通过在 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 词典实现了摘要 table 创建,但我对解决方案不满意。
这是我到目前为止尝试过的代码片段: 路径 = "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")
如果您的数据框如下所示:
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 代码,我可以根据您的情况修改答案。
您是否尝试根据三个属性(城市、SKU、年份)对它们进行分组?