我想透视一个火花数据框,我参考了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'
,我该怎么做才能解决此问题?
答案 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
类中定义的方法。