首页 > 解决方案 > Spark:如何根据 Scala 中的字符串模式进行分组?

问题描述

我有一个数据框:

[data :String, itemType:String, itemClass:String, itemGroup:String]

其中 itemType、itemClass 和 itemGroup 包含逗号分隔的字符串。我分解了它们并为每个值创建了一行。

df.withColumn("itemType", explode(split($"itemType", "[,]")))
   .withColumn("itemGroup", explode(split($"itemGroup", "[,]")))
   .withColumn("itemClass", explode(split($"itemClass", "[,]")))

我正在尝试按 itemType、itemGroup 和 itemClass 的值进行分组。

df.groupBy($"itemType".contains("item class ")).count() 

但这只是给了我真实和空值,但没有按模式分组。有没有办法按最常见的模式分组但不完全匹配。

标签: scalaapache-sparkgroup-by

解决方案


您可以根据正则表达式以这种方式进行分组。您需要为您的数据编写自己的正则表达式,并且可以按如下方式分组。

这是对一些样本数据进行分组的一种方法。

假设您的数据框 IDdf和数据如下所示。

分组前:df.show()

+----+----------+------------+-----------+
|data|  itemType|   itemGroup|  itemClass|
+----+----------+------------+-----------+
|   1|type1_dgdf| group1_flkk|class1_gdfg|
|   1|type1_jhgj| group1_fgfd|class1_grtt|
|   1|type1_657g| group1_6gfh|class1_342e|
|   1| type1_qer|  group2_wqw|class1_fgfv|
|   2|type2_seds|  group2_wqw|class2_fiuy|
|   2|  type2_65|group2_wuyuy|class2_232e|
|   2| type2_ffg| group2_wyty|class2_fere|
+----+----------+------------+-----------+

分组后:

+--------+---------+---------+-----+
|itemType|itemGroup|itemClass|count|
+--------+---------+---------+-----+
|   type1|   group2|   class1|    1|
|   type2|   group2|   class2|    3|
|   type1|   group1|   class1|    3|
+--------+---------+---------+-----+

代码:

import org.apache.spark.sql.functions.regexp_extract

df.groupBy(
            regexp_extract(df("itemType"), "(type\\d).*$", 1).alias("itemType"),  // here pattern matches for starting with `type` and then any number using `\d` (\\d for windows).. same logic for others as well.
            regexp_extract(df("itemGroup"), "(group\\d).*$", 1).alias("itemGroup"),
            regexp_extract(df("itemClass"), "(class\\d).*$", 1).alias("itemClass"))
            .count().show()

推荐阅读