我有一个数据帧,列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获取此信息?
答案 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|
+---+-----+
注意:这会选择与模式匹配的第一行,如果没有匹配则选择组中的最后一行。