Dataframe GroupBy 在包含模式的列上聚合
Posted
技术标签:
【中文标题】Dataframe GroupBy 在包含模式的列上聚合【英文标题】:Dataframe GroupBy aggregate on column that contains pattern 【发布时间】:2017-02-21 20:07:31 【问题描述】:我有一个数据框,其中包含 c1、c2 列。我想将它们分组在 c1 上并希望选择 c2 使得 c2 值包含一个模式,如果所有 c2 不包含模式返回任何人
示例 df :
c1 c2
1 ai_za
1 ah_px
1 ag_po
1 af_io
1 ae_aa
1 ad_iq
1 ac_on
1 ab_eh
1 aa_bs
2 aa_ab
2 aa_ac
如果 c2 中需要的模式是 '_io'
预期结果:
c1 c2
1 af_io
2 aa_ab
1 af_io
被返回,因为它包含 '_io' 模式
2 aa_ab
随机返回,因为第 2 组中没有人包含模式“_io”
如何使用 spark 数据帧/数据集 api 获取此信息?
【问题讨论】:
如果有多个行包含_io
模式,是否要选择所有行?
如果有多个包含_io
模式,则选择第一行
【参考方案1】:
如果不匹配选哪一行也无所谓,可以试试:
df.groupByKey(_.getAs[Int]("c1")).
reduceGroups((x, y) => if(x.getAs[String]("c2").matches(".*_io")) x else y).
toDF("key", "value").
select("value.c1", "value.c2").show
+---+-----+
| c1| c2|
+---+-----+
| 1|af_io|
| 2|aa_ac|
+---+-----+
注意:这会选择与模式匹配的第一行,如果没有匹配则选择组中的最后一行。
【讨论】:
非常感谢@Psidom以上是关于Dataframe GroupBy 在包含模式的列上聚合的主要内容,如果未能解决你的问题,请参考以下文章
如何在 groupby 2 列之后保留 DataFrame 的原始索引?
PySpark 1.5 Groupby Sum 用于 Dataframe 中的新列