pySpark Dataframe 上聚合的多个标准

Posted

技术标签:

【中文标题】pySpark Dataframe 上聚合的多个标准【英文标题】:multiple criteria for aggregation on pySpark Dataframe 【发布时间】:2016-10-27 01:08:12 【问题描述】:

我有一个如下所示的 pySpark 数据框:

+-------------+----------+
|          sku|      date|
+-------------+----------+
|MLA-603526656|02/09/2016|
|MLA-603526656|01/09/2016|
|MLA-604172009|02/10/2016|
|MLA-605470584|02/09/2016|
|MLA-605502281|02/10/2016|
|MLA-605502281|02/09/2016|
+-------------+----------+

我想按 sku 分组,然后计算最小和最大日期。如果我这样做:

df_testing.groupBy('sku') \
    .agg('date': 'min', 'date':'max') \
    .limit(10) \
    .show()

行为与 Pandas 相同,我只得到 skumax(date) 列。在 Pandas 中,我通常会执行以下操作以获得我想要的结果:

df_testing.groupBy('sku') \
    .agg('day': ['min','max']) \
    .limit(10) \
    .show()

但是在 pySpark 上这不起作用,我得到一个 java.util.ArrayList cannot be cast to java.lang.String 错误。谁能指出正确的语法?

谢谢。

【问题讨论】:

【参考方案1】:

你不能使用字典。使用:

>>> from pyspark.sql import functions as F
>>>
>>> df_testing.groupBy('sku').agg(F.min('date'), F.max('date'))

【讨论】:

谢谢!这解决了问题。最初我尝试了from pyspark.sql.functions import min, max 和您提出的方法,只是没有 F。也许 python 将 SQL 函数与本机函数混淆了。 我的意思是,我不会将其称为答案,因为它不能解决必须从本质上对字典进行非规范化的问题。哦,我的错!它确实解决了最初的问题,但非规范化问题仍然存在。

以上是关于pySpark Dataframe 上聚合的多个标准的主要内容,如果未能解决你的问题,请参考以下文章

pyspark - 使用 RDD 进行聚合比 DataFrame 快得多

具有聚合唯一值的pyspark dataframe groupby [重复]

在 PySpark Dataframe 中结合旋转和分组聚合

PySpark DataFrame的逐行聚合

如何将 groupBy 和聚合函数应用于 PySpark DataFrame 中的特定窗口?

在 Pyspark 中合并 DataFrame