使用scala对与列中的子字符串匹配的行进行分组

时间:2018-03-15 04:54:39

标签: scala group-by

我有一个文件:

Zip  | Name  | id |    
abc  | xyz   | 1  |    
def  | wxz   | 2  |    
abc  | wex   | 3  |    
bcl  | rea   | 4  |    
abc  | txc   | 5  |  
def  | rfx   | 6  | 
abc  | abc   | 7  |

我需要将包含' x'的所有名称分组。基于相同的Zip使用scala

期望的输出:

Zip  | Count |
abc  | 3     |     
def  | 2     |

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

正如@Shaido在上面的评论中提到的,您只需要filtergroupBy聚合

import org.apache.spark.sql.functions._
fol.filter(col("Name").contains("x")) //filtering the rows that has x in the Name column
  .groupBy("Zip")                 //grouping by Zip column
  .agg(count("Zip").as("Count"))  //counting the rows in each groups
  .show(false)

你应该有所需的输出

+---+-----+
|Zip|Count|
+---+-----+
|abc|3    |
|def|2    |
+---+-----+

答案 1 :(得分:0)

您想分组以下数据框。

+---+----+---+
|zip|name| id|
+---+----+---+
|abc| xyz|  1|
|def| wxz|  2|
|abc| wex|  3|
|bcl| rea|  4|
|abc| txc|  5|
|def| rfx|  6|
|abc| abc|  7|
+---+----+---+

然后您只需使用groupBy函数传递列参数,然后count就可以得到结果。

val groupedDf: DataFrame = df.groupBy("zip").count()
groupedDf.show()
// +---+-----+
// |zip|count|
// +---+-----+
// |bcl|    1|
// |abc|    4|
// |def|    2|
// +---+-----+