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 DataFrame 的 groupBy vs groupByKey
Spark中groupBy groupByKey reduceByKey的区别