在Spark DataFrame中执行数据透视时,“ GroupedData”对象没有属性“ show”

时间:2018-08-13 11:10:31

标签: python pandas apache-spark dataframe pyspark

我想透视一个火花数据框,我参考了pyspark documentation,基于pivot函数,线索是.groupBy('name').pivot('name', values=None)。这是我的数据集,

 In[75]:  spDF.show()
 Out[75]:

+-----------+-----------+
|customer_id|       name|
+-----------+-----------+
|      25620| MCDonnalds|
|      25620|  STARBUCKS|
|      25620|        nan|
|      25620|        nan|
|      25620| MCDonnalds|
|      25620|        nan|
|      25620| MCDonnalds|
|      25620|DUNKINDONUT|
|      25620|   LOTTERIA|
|      25620|        nan|
|      25620| MCDonnalds|
|      25620|DUNKINDONUT|
|      25620|DUNKINDONUT|
|      25620|        nan|
|      25620|        nan|
|      25620|        nan|
|      25620|        nan|
|      25620|   LOTTERIA|
|      25620|   LOTTERIA|
|      25620|  STARBUCKS|
+-----------+-----------+
only showing top 20 rows

然后我尝试改变表名

In [96]:
spDF.groupBy('name').pivot('name', values=None)
Out[96]:
<pyspark.sql.group.GroupedData at 0x7f0ad03750f0>

当我尝试显示它们时

In [98]:
spDF.groupBy('name').pivot('name', values=None).show()
Out [98]:

    ---------------------------------------------------------------------------
AttributeError                       Traceback (most recent call last)
<ipython-input-98-94354082e956> in <module>()
----> 1 spDF.groupBy('name').pivot('name', values=None).show()
AttributeError: 'GroupedData' object has no attribute 'show'

我不知道为什么无法显示'GroupedData',我该怎么做才能解决此问题?

2 个答案:

答案 0 :(得分:2)

pivot()方法返回一个GroupedData对象,就像groupBy()一样。您必须先在其上使用聚合函数(例如show()甚至是GroupedData),才能在sum()对象上使用count()

有关更多信息,请参见this article

答案 1 :(得分:2)

让我们创建一些类似于您的数据集的测试数据:

data = [
    ("123", "McDonalds"),
    ("123", "Starbucks"),
    ("123", "McDonalds"),
    ("777", "McDonalds"),
    ("777", "McDonalds"),
    ("777", "Dunkin")
]
df = spark.createDataFrame(data, ["customer_id", "name"])
df.show()
+-----------+---------+
|customer_id|     name|
+-----------+---------+
|        123|McDonalds|
|        123|Starbucks|
|        123|McDonalds|
|        777|McDonalds|
|        777|McDonalds|
|        777|   Dunkin|
+-----------+---------+

让我们旋转数据集,使customer_id为列:

df.groupBy("name").pivot("customer_id").count().show()

+---------+----+----+
|     name| 123| 777|
+---------+----+----+
|McDonalds|   2|   2|
|Starbucks|   1|null|
|   Dunkin|null|   1|
+---------+----+----+

现在让我们旋转数据框架,使餐厅名称成为列:

df.groupBy("customer_id").pivot("name").count().show()

+-----------+------+---------+---------+
|customer_id|Dunkin|McDonalds|Starbucks|
+-----------+------+---------+---------+
|        777|     1|        2|     null|
|        123|  null|        2|        1|
+-----------+------+---------+---------+

类似df.groupBy("name").show()的代码因AttributeError: 'GroupedData' object has no attribute 'show'消息而出错。您只能在pyspark.sql.GroupedData类的实例上调用GroupedData类中定义的方法。