如何使用spark RDD来达到以下要求

时间:2017-01-14 03:30:04

标签: scala apache-spark apache-spark-sql spark-dataframe

我对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

提前感谢。

2 个答案:

答案 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|
+----+-----+-----+