Apache spark 按部门ID和;确定员工ID最多的前两个部门

Apache spark 按部门ID和;确定员工ID最多的前两个部门,apache-spark,lambda,pyspark,apache-spark-sql,Apache Spark,Lambda,Pyspark,Apache Spark Sql,第一次使用Spark。我为两个csv文件(员工和部门)创建了RDD。我想提供一个输出,按部门ID统计员工数量,并确定员工ID最多的前两个部门名称。“deptno”是我的主键,但我不知道如何将这两个文件连接在一起 员工文件包含以下列:[empno、ename、job、mgr、hiredate、sal、comm、deptno] dept文件包含以下列:[deptno、dname、location] 以下是我迄今为止所做的工作: `employees_rdd = sc.textFile("/

第一次使用Spark。我为两个csv文件(员工和部门)创建了RDD。我想提供一个输出,按部门ID统计员工数量,并确定员工ID最多的前两个部门名称。“deptno”是我的主键,但我不知道如何将这两个文件连接在一起

员工文件包含以下列:[empno、ename、job、mgr、hiredate、sal、comm、deptno]

dept文件包含以下列:[deptno、dname、location]

以下是我迄今为止所做的工作:

`employees_rdd = sc.textFile("/FileStore/tables/Employee.csv")
employees_rdd.take(3)
header_e = employees_rdd.first()
employees1 = employees_rdd.filter(lambda row : row != header_e)
employees1.take(1)`

`dept_rdd = sc.textFile("/FileStore/tables/Dept.csv")
dept_rdd.take(3)
header_d = dept_rdd.first()
dept1 = dept_rdd.filter(lambda row : row != header_d)
dept1.take(1)`

`employees2 = employees1.map(lambda row : row.split(","))
employees_kv = employees2.map(lambda row : (row[7],1))
employees_kv.take(3)`
在以下位置接收语法错误:

雇员(千伏)还原基(λx,y:x+y)。已订购(2,λ(x,y):-1*y)
非常感谢您的帮助。

我强烈建议您使用数据帧/数据集。不仅因为它们更易于使用和操作,而且它们还提供了显著的性能改进。就连spark文档也建议这样做

下面是您的数据帧代码:-

val spark = SparkSession.builder.master("local[*]").getOrCreate
这将创建一个
SparkSession
,它是应用程序的入口点

现在,让我们阅读您的员工和部门文件

val employeeDF = spark.read.format("csv").option("header","true").load("/path/to/employee/file")
val deptDF = spark.read.format("csv").option("header","true").load("/path/to/dept/file")
现在,加入很容易。下面的语句将创建一个数据帧,该数据帧是
employeeDF
deptDF
deptno

val joinedDF = employeeDF.join(deptDF,Seq("deptno"))
现在,您可以使用
joinedDF
获取结果

val countByDept = joinedDF.groupBy($"deptno").count
//countByDept.show to display the results

val top2Dept = joinedDF.groupBy($"dname").count.orderBy($"count".desc).limit(2)
//top2Dept.show to display the results

希望这能让您开始使用Spark数据帧和数据集的旅程。

以下是我的pyspark代码。我假设read语句带有分隔符“|”

结果:

+------+---------------+
|deptno|no_of_employees|
+------+---------------+
|20    |5              |
|10    |3              |
|30    |6              |
+------+---------------+
+----------+---------------+
|dname     |no_of_employees|
+----------+---------------+
|'Sales'   |6              |
|'Research'|5              |
+----------+---------------+

如果您使用dataframe,那么它将更加容易。再见,谢谢你的帮助。我使用的是Python语言,所以我转换了您推荐的内容。我遇到了加入的问题。我已将
val joinedDF=employeeDF.join(deptDF,Seq(“deptno”)
转换为
join\u df=dept\join(employee\u df.select(“deptno”),“deptno”)
我收到以下消息:AnalysisException:“无法解析”
deptno
“给定的输入列:[empno、ename、job、mgr、hiredate、sal、comm、deptno];\n'Project['deptno]\n+-关系[empno、ename、job、mgr、hiredate、sal、comm、deptno#120]csv\n”。这是因为模式类型是字符串还是int?我也尝试了这种稍微不同的方法:
joined\u df=dept\u df.join(employee\u df,dept\u df.deptno==employee\u df.deptno)
但收到了以下消息:AttributeError:“DataFrame”对象没有属性“deptno”
+------+---------------+
|deptno|no_of_employees|
+------+---------------+
|20    |5              |
|10    |3              |
|30    |6              |
+------+---------------+
+----------+---------------+
|dname     |no_of_employees|
+----------+---------------+
|'Sales'   |6              |
|'Research'|5              |
+----------+---------------+