代码之家  ›  专栏  ›  技术社区  ›  user3407267

Spark:如何在Scala中基于字符串模式进行分组?

  •  0
  • user3407267  · 技术社区  · 8 年前

    [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 回复  |  直到 8 年前
        1
  •  1
  •   Praveen L    8 年前

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

    下面是一种使用一些示例数据进行分组的方法。

    假设您的数据帧id 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()
    
    推荐文章