【问题标题】:Analytic in Spark DataframeSpark Dataframe 中的分析
【发布时间】:2017-08-26 15:31:03
【问题描述】:

在这个问题中,我们有两个经理 M1 和 M2,在经理 M1 的团队中有两个员工 e1 和 e2,在 M2 的团队中有两个员工 e4 和 e5 以下是经理和员工层次结构,

1) M1 一个。 e1 湾。 e2 2) M2 一个。 e4 湾。 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 – 员工可以看到他的工作日和薪水

【问题讨论】:

  • 那么,你的问题是什么?
  • 那么您尝试过什么但没有工作?
  • 嗨,@Juan 使用上述 Dataframe 查找每个经理的团队的 work_days
  • @Ram,给我一些提示以继续它。

标签: apache-spark


【解决方案1】:

根据我从您的问题中了解到的情况,我建议您这样做。

首先,您需要创建经理的数据框,其下有员工

经理1

+---+------+
|sn |emp_id|
+---+------+
|a  |e1    |
|b  |e2    |
+---+------+

经理2

+---+------+
|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)的dataframe

+------+--------+------+---------+
|emp_id|month_id|salary|work_days|
+------+--------+------+---------+
|e1    |1       |66000 |22       |
|e1    |2       |48000 |16       |
|e1    |3       |87000 |29       |
+------+--------+------+---------+

希望回答对你有帮助

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多