在这个问题中我们有两个经理M1和M2,经理M1的团队有两个员工e1& e2和M2团队有两名员工e4& e5以下是Manager和Employee Hierarchy,
1) M1 a. e1 b. e2 2) M2 a. e4 b. e5
我们有员工,工资数据框
+------+--------+------+---------+ |emp_id|month_id|salary|work_days| +------+--------+------+---------+ |e1 |1 |66000 |22 | |e1 |2 |48000 |16 | |e1 |3 |87000 |29 | |e2 |1 |75000 |25 | |e2 |4 |69000 |23 | |e2 |5 |66000 |22 | |e4 |1 |90000 |30 | |e4 |2 |87000 |29 | |e5 |3 |72000 |24 | |e5 |1 |57000 |19 | |e5 |4 |51000 |17 | |e5 |5 |69000 |23 | +------+--------+------+---------+
使用以下规则查找新数据框
规则1-经理可以查看其团队的工作日
规则2 - 员工可以查看他的work_days和薪水
答案 0 :(得分:1)
根据我对你的问题的理解,我建议你这样做。
首先,您需要创建包含其下员工的经理的数据框
manager1
+---+------+
|sn |emp_id|
+---+------+
|a |e1 |
|b |e2 |
+---+------+
manager2
+---+------+
|sn |emp_id|
+---+------+
|a |e4 |
|b |e5 |
+---+------+
然后你应该编写一个函数,它将在经理下面返回一份员工列表
import org.apache.spark.sql.functions._
def getEmployees(df : DataFrame): List[String] = {
df.select(collect_list("emp_id")).first().getAs[mutable.WrappedArray[String]](0).toList
}
最后一步是编写一个仅过滤作为
传递的员工的函数def getEmployeeDetails(df: DataFrame, list: List[String]) : DataFrame ={
df.filter(df("emp_id").isin(list: _*))
}
现在,如果您想查看manager1(m1)下的员工,那么
getEmployeeDetails(df, getEmployees(m1)).show(false)
会回复你
+------+--------+------+---------+
|emp_id|month_id|salary|work_days|
+------+--------+------+---------+
|e1 |1 |66000 |22 |
|e1 |2 |48000 |16 |
|e1 |3 |87000 |29 |
|e2 |1 |75000 |25 |
|e2 |4 |69000 |23 |
|e2 |5 |66000 |22 |
+------+--------+------+---------+
你也可以为其他经理做同样的事情
你也可以为员工做同样的事情
getEmployeeDetails(df, List("e1")).show(false)
将返回employee1(e1)的数据框
+------+--------+------+---------+
|emp_id|month_id|salary|work_days|
+------+--------+------+---------+
|e1 |1 |66000 |22 |
|e1 |2 |48000 |16 |
|e1 |3 |87000 |29 |
+------+--------+------+---------+
我希望答案很有帮助