Spark: Как сгруппировать по шаблону строки в Scala? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть фрейм данных:

[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() 

, но это просто дает мне значение true и null, но не группирует по шаблону.Есть ли способ группировки по наиболее распространенному шаблону, но не по точному совпадению.

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете группировать таким образом на основе регулярных выражений. Вам необходимо написать собственное регулярное выражение для ваших данных и сгруппировать их, как показано ниже.

Вот один из способов группировки некоторых данных.

предположим, что ваш идентификатор датафрейма df, а данные выглядят как показано ниже.

Перед группировкой: 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()
...