我对Spark很新。请你帮忙下面要求.. 我有以下源文件。第一个字段是名称,第二个字段是组ID。我需要计算这个名称有多少组,并列出所有组和计数。
abc 1
abc 2
abc 3
xyz 1
xyz 3
def 2
def 4
lmn 6
我想要低于前
name dept count
abc 1,2,3 3
xyz 1,3 2
def 2,4 2
lmn 6 1
提前感谢。
答案 0 :(得分:2)
假设您有一个CSV文件。因此,首先使用以下步骤创建数据帧。
import org.apache.spark.sql.types._
import org.apache.spark.Row
val members = sc.textFile("member").Map(lines => lines.split(",")).map(a => Row(a(0),a(1)))
val rddStruct = new StructType(Array(StructField("name", StringType, nullable = true),StructField("depart", StringType, nullable = true)))
val df = sqlContext.createDataFrame(members,rddStruct)
要实现输出,可以遵循以下步骤。
应用groupBy函数可以将所有部门收集为一组
val df2 = df.groupBy("Name").agg(collect_set("Depart").as("Depart"))
df2.show
+---+-----------+
| Name| Depart|
+---+-----------+
|lmn| [6]|
|def| [2, 4]|
|abc|[1, 2, 3]|
|xyz| [1, 2]|
+---+---------+
然后在Depart列上应用尺寸函数以获得计数。
val df3 = df2.withColumn("Count", size(df2("Depart")))
df3.show
+---+---------+-----+
| Name| Depart|Count|
+---+---------+-----+
|lmn| [6]| 1|
|def| [2, 4]| 2|
|abc|[1, 2, 3]| 3|
|xyz| [1, 2]| 2|
+---+---------+-----+
如果需要的结果应按降序排序,则可以在上面的输出中应用orderBy函数。
val df4 = df3.orderBy(desc("Count"))
df4.show
+---+---------+-----+
| Name| Depart|Count|
+---+---------+-----+
|abc|[1, 2, 3]| 3|
|def| [2, 4]| 2|
|xyz| [1, 2]| 2|
|lmn| [6]| 1|
+---+---------+-----+
关于structType,您可以阅读here
答案 1 :(得分:0)
您可以使用RDD转换简化:
scala> var rdd = sc.textFile("/data_test1")
scala> rdd.map(x => x.split(" ")).
map(x => (x(0), x(1))).
groupByKey().
map(x => (x._1, x._2.toSet.mkString(","),x._2.size)).
toDF("name", "dept", "count").show()
输出:
+----+-----+-----+
|name| dept|count|
+----+-----+-----+
| abc|1,2,3| 3|
| lmn| 6| 1|
| def| 2,4| 2|
| xyz| 1,3| 2|
+----+-----+-----+