Spark Dataframe中的分析

时间:2017-08-25 13:56:51

标签: apache-spark

在这个问题中我们有两个经理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和薪水

1 个答案:

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

我希望答案很有帮助