首页 > 解决方案 > Pyspark - 枢轴功能问题

问题描述

输入应如下所示:

公司 销售量
亚马逊 100
翻转卡丁车 900
易趣 890
亚马逊 100
翻转卡丁车 100
易趣 10
亚马逊 100
翻转卡丁车 90
易趣 10

预期输出应如下所示:

亚马逊 翻转卡丁车 易趣
300 1090 910

尝试使用枢轴功能,但它不起作用。对此的任何帮助将不胜感激..在此先感谢..

标签: apache-sparkpysparkpivot

解决方案


我一直在使用以下测试数据集来编写此解决方案:

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

推荐阅读