Spark 中 groupBy 的使用

Posted

技术标签:

【中文标题】Spark 中 groupBy 的使用【英文标题】:Usage of groupBy in Spark 【发布时间】:2016-07-14 14:04:14 【问题描述】:

我目前正在学习 python。我有一个小问题,在 SQL 等其他语言中,我们可以简单地按指定列对表进行分组,然后对它们执行进一步的操作,如求和、计数等。我们如何在 Spark 中做到这一点?

我有类似的架构:

    [name:"ABC", city:"New York", money:"50"]
    [name:"DEF", city:"London", money:"10"]
    [name:"ABC", city:"New York", money:"30"]
    [name:"XYZ", city:"London", money:"20"]
    [name:"XYZ", city:"London", money:"100"]
    [name:"DEF", city:"London", money:"200"]

假设我想按城市分组,然后为每个名称执行金额总和。类似的东西:

    New York ABC 80
    London DEF 210
    London XYZ 120

【问题讨论】:

【参考方案1】:

你可以使用 SQL:

>>> sc.parallelize([
... "name": "ABC", "city": "New York", "money":"50",
... "name": "DEF", "city": "London",   "money":"10",
... "name": "ABC", "city": "New York", "money":"30",
... "name": "XYZ", "city": "London",   "money":"20",
... "name": "XYZ", "city": "London",   "money":"100",
... "name": "DEF", "city": "London",   "money":"200",
... ]).toDF().registerTempTable("df")

>>> sqlContext.sql("""SELECT name, city, sum(cast(money as bigint)) AS total 
... FROM df GROUP name, city""")

【讨论】:

感谢您的回复。知道如何在 spark 中执行 sql 语句,这将使生活变得更加轻松。【参考方案2】:

您也可以以 Python 方式执行此操作(或发布的 SQL 版本 @LostInOverflow):

grouped = df.groupby('city', 'name').sum('money')

看起来您的 money 列是字符串,因此您需要先将其转换为 int(或以这种方式开始加载):

df = df.withColumn('money', df['money'].cast('int'))

请记住,数据帧是不可变的,因此这两个都要求您将它们分配给一个对象(即使它只是再次回到df),然后如果您想查看结果,请使用show

编辑:我应该补充一点,您需要先创建一个数据框。对于您的简单数据,它与发布的 SQL 版本几乎相同,但您将其分配给数据框对象而不是将其注册为表:

df = sc.parallelize([
    "name": "ABC", "city": "New York", "money":"50",
    "name": "DEF", "city": "London",   "money":"10",
    "name": "ABC", "city": "New York", "money":"30",
    "name": "XYZ", "city": "London",   "money":"20",
    "name": "XYZ", "city": "London",   "money":"100",
    "name": "DEF", "city": "London",   "money":"200",
    ]).toDF()

【讨论】:

感谢 Jeff,我实际上错误地将钱打印为 char,但现在我知道当它们不是 int 时该怎么办。感谢您的帮助!

以上是关于Spark 中 groupBy 的使用的主要内容,如果未能解决你的问题,请参考以下文章

Spark 中 groupBy 的使用

Spark DataFrame 的 groupBy vs groupByKey

GroupBy和集合交集

Spark中groupBy groupByKey reduceByKey的区别

不能在 Spark DataFrame 中使用 orderBy 或 groupBy 函数

如何在 python 中使用 Spark Data frame 和 GroupBy 派生 Percentile