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

Scala 包含模式的列上的Dataframe GroupBy聚合,scala,apache-spark,dataframe,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中需要的模式是“\u io” 预期结果: c1 c2 1 af_io 2 aa_ab 返回1个

我有一个数据帧,列为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中需要的模式是“\u io”

预期结果:

c1  c2
1   af_io
2   aa_ab
返回1个af_io,因为它包含“_io”模式

2 aa_ab以随机方式返回,因为第2组中没有人包含模式“_io”


如何使用spark dataframe/dataset api获取此信息?

如果没有匹配项,则选择哪一行无关紧要,您可以尝试:

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|
+---+-----+

注意:这将拾取与模式匹配的第一行,如果不匹配,则拾取组中的最后一行。

如果有多行包含_io模式,是否要拾取所有行?如果有多行包含_io模式,则拾取第一行非常感谢@Psidom