Dataframe GroupBy在包含模式的列上聚合

时间:2017-02-21 20:07:32

标签: scala apache-spark dataframe

我有一个数据帧,列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 dataframe / dataset api获取此信息?

1 个答案:

答案 0 :(得分: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|
+---+-----+

注意:这会选择与模式匹配的第一行,如果没有匹配则选择组中的最后一行。