【问题标题】:'GroupedData' object has no attribute 'show' when doing doing pivot in spark dataframe'GroupedData' 对象在 spark 数据帧中执行枢轴时没有属性'show'
【发布时间】:2019-01-20 02:31:17
【问题描述】:

我想旋转一个 spark 数据框,我参考 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'显示不出来,怎么解决?

【问题讨论】:

    标签: python pandas apache-spark dataframe pyspark


    【解决方案1】:

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

    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_ids 成为列:

    df.groupBy("name").pivot("customer_id").count().show()
    
    +---------+----+----+
    |     name| 123| 777|
    +---------+----+----+
    |McDonalds|   2|   2|
    |Starbucks|   1|null|
    |   Dunkin|null|   1|
    +---------+----+----+
    

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

    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' 消息。您只能在GroupedData 类的实例上调用pyspark.sql.GroupedData 类中定义的方法。

    【讨论】:

      【解决方案2】:

      pivot() 方法返回一个GroupedData 对象,就像groupBy() 一样。你不能在 GroupedData 对象上使用 show() 而不使用聚合函数(例如 sum() 甚至 count())。

      更多信息请参见this article

      【讨论】:

      • 感谢您的解释,点赞,仍在等待最佳答案
      • 或者您希望我输入您可以复制粘贴并使其正常工作的代码?
      • 这实际上是不正确的。最佳答案为您指明方向。最简单的答案会立即为您提供代码。既然您知道问题是什么(提示:您必须使用聚合函数),您可以通过解决这个问题来学习,而不会再遇到这个问题。如果我立即给您功能代码,您将不知道发生了什么,并且会继续绊倒,因为这是很常见的事情。
      • 你能添加一个例子吗?谢谢
      • 对分组数据执行 .agg 函数,并从该 df 中获取您想要的内容。例如,.agg(max("userid")).select("userId").show()。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 2021-01-05
      • 2019-05-06
      • 2017-04-30
      • 1970-01-01
      • 2022-12-24
      • 2021-05-06
      相关资源
      最近更新 更多