apache-spark - Pyspark - 枢轴功能问题
问题描述
输入应如下所示:
公司 | 销售量 |
---|---|
亚马逊 | 100 |
翻转卡丁车 | 900 |
易趣 | 890 |
亚马逊 | 100 |
翻转卡丁车 | 100 |
易趣 | 10 |
亚马逊 | 100 |
翻转卡丁车 | 90 |
易趣 | 10 |
预期输出应如下所示:
亚马逊 | 翻转卡丁车 | 易趣 |
---|---|---|
300 | 1090 | 910 |
尝试使用枢轴功能,但它不起作用。对此的任何帮助将不胜感激..在此先感谢..
解决方案
我一直在使用以下测试数据集来编写此解决方案:
data = [("amazon", 100), ("flipkart", 300), ("amazon", 50), ("ebay", 50), ("ebay", 150), ("amazon", 300)]
columns= ["company", "sales"]
df = spark.createDataFrame(data = data, schema = columns)
这将产生以下数据框:
+--------+-----+
|company |sales|
+--------+-----+
|amazon |100 |
|flipkart|300 |
|amazon |50 |
|ebay |50 |
|ebay |150 |
|amazon |300 |
+--------+-----+
对于您的特定宽表,我将执行以下操作:
df \
.groupBy("company") \
.pivot("company") \
.sum("sales")
Spark 将保存保留空值。该功能pivot
本身非常昂贵。
要真正获得结果,您可以执行以下操作,null
通过再次分组和求和来删除值。
companies = list(
df.select('company').toPandas()['company'].unique()
)
pdf = df \
.groupBy("company") \
.pivot("company") \
.sum("sales") \
.groupBy() \
.agg(*[F.sum(c).alias(c) for c in companies])
结果是:
+------+--------+----+
|amazon|flipkart|ebay|
+------+--------+----+
| 450| 300| 200|
+------+--------+----+
推荐阅读
- fabricjs - Fabric JS 2.4.1 使用复制/粘贴示例时出现问题,对象卡在剪贴板中
- service - 在一台机器上部署两个服务
- javascript - Javascript Vue 事件发出不值
- css - Button 组件的覆盖不会改变悬停颜色
- jsf - Jboss X JSF 实现版本矩阵是什么?
- asp.net - 使用gridview制作表格
- c# - 在 C# 中的组合逻辑上替代 if/else
- sql - 具有日期范围和分组依据的 SSRS 报告
- python - Django Rest 框架错误'django.core.urlsolvers'
- ansible - ansible add_host 从文件中设置变量