'GroupedData' 对象在 Spark 数据帧中执行数据透视时没有属性 'show'

Nab*_*zir 7 python dataframe pandas apache-spark pyspark

我想旋转一个 spark 数据,我参考 pyspark 文档,并根据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
Run Code Online (Sandbox Code Playgroud)

然后我尝试旋转表名

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

当我试图向他们展示

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'
Run Code Online (Sandbox Code Playgroud)

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

ech*_*ch0 16

pivot()方法返回一个GroupedData对象,就像groupBy(). 如果之前没有show()GroupedData对象上使用聚合函数(例如sum()或 even count()),则不能在该对象上使用。

查看这篇文章了解更多信息

  • 或者您是否希望我输入您可以复制粘贴的代码并使其正常工作? (3认同)
  • 那实际上是不正确的。最佳答案为您指明方向。最简单的答案将立即为您提供代码。既然您知道问题是什么(提示:您必须使用聚合函数),您可以通过解决这个问题来学习,并且再也不会遇到这个问题。如果我立即为您提供功能代码,您将不知道发生了什么,并且会继续为此绊倒,因为这是很常见的事情。 (3认同)
  • 对分组数据执行 .agg 函数,并从该 df 中获取您想要的内容。例如,.agg(max("userid")).select("userId").show()。 (2认同)

Pow*_*ers 6

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

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

让我们对数据集进行透视,使 customer_ids 成为列:

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

+---------+----+----+
|     name| 123| 777|
+---------+----+----+
|McDonalds|   2|   2|
|Starbucks|   1|null|
|   Dunkin|null|   1|
+---------+----+----+
Run Code Online (Sandbox Code Playgroud)

现在让我们旋转 DataFrame,使餐厅名称成为列:

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

+-----------+------+---------+---------+
|customer_id|Dunkin|McDonalds|Starbucks|
+-----------+------+---------+---------+
|        777|     1|        2|     null|
|        123|  null|        2|        1|
+-----------+------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

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