Pyspark - 枢轴函数问题

Pyspark - Pivot function issue

输入应如下所示:

company sales
amazon 100
flipkart 900
ebay 890
amazon 100
flipkart 100
ebay 10
amazon 100
flipkart 90
ebay 10

预期输出应如下所示:

amazon flipkart ebay
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  |
+--------+-----+

对于您的特定宽度 table 我将执行以下操作:

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

使用 groupBy() 和 first() 函数。

data = [("amazon", 100), ("flipkart", 300), ("amazon", 50), ("ebay", 50), ("ebay", 150), ("amazon", 300)]
df = spark.createDataFrame(data,["company","sales"])
df.show()
+--------+-----+
| company|sales|
+--------+-----+
|  amazon|  100|
|flipkart|  300|
|  amazon|   50|
|    ebay|   50|
|    ebay|  150|
|  amazon|  300|
+--------+-----+

df.groupBy("company").agg(sum("sales").alias("sales"))\
.groupBy().pivot("company").agg(first("sales")).show()


+------+----+--------+
|amazon|ebay|flipkart|
+------+----+--------+
|   450| 200|     300|
+------+----+--------+

感谢@andy 提供帮助列解决方案

df.groupBy(lit(0).alias("Key")).pivot("company")\
.agg(sum("sales").alias("sales")).show()

+---+------+----+--------+
|Key|amazon|ebay|flipkart|
+---+------+----+--------+
|  0|   450| 200|     300|
+---+------+----+--------+

可以使用 drop() 函数删除键列

df.groupBy(lit(0).alias("Key")).pivot("company")\
.agg(sum("sales").alias("sales")).drop("key").show()
+------+----+--------+
|amazon|ebay|flipkart|
+------+----+--------+
|   450| 200|     300|
+------+----+--------+

您可以使用其他答案中显示的 pivot() 功能。

这是 groupBy()pivot() 组合的较短版本。

>>> data = [("amazon", 100), ("flipkart", 300), ("amazon", 50), ("ebay", 50), ("ebay", 150), ("amazon", 300)]
>>> df = spark.createDataFrame(data,["company","sales"])
>>> df.groupBy().pivot('company').sum('sales').show()
+------+----+--------+
|amazon|ebay|flipkart|
+------+----+--------+
|   450| 200|     300|
+------+----+--------+