Невозможно разрешить символ. Со столбцом в искре 2.4 - PullRequest
0 голосов
/ 04 августа 2020

Spark: 2,4

Фрейм данных содержит среднее время входа в систему для каждого сотрудника

AverageLoginHour|employee
3.392265193     |emp_1
2.833333333     |emp_2
5.638888889     |emp_3
6.909090909     |emp_4
7.361445783     |emp_5

Код:

tds.select("Employee","AverageLoginHour")
    (count("AverageLoginHour").alias("logincnt"))
    (sum("AverageLoginHour").alias("loginsum"))
      .withColumn("TotalEmployeeavg",col("loginsum")/col("logincnt")*100)

Error: Cannot resolve symbol .withcolumn

Ожидаемый результат:

AverageLoginHour|   employee    Totalavg|Remarks
3.392265193     |    Emp_1      |5.2    |Below Avg
2.833333333     |    Emp_2      |5.2    |Below Avg
5.638888889     |    Emp_3      |5.2    |Above Avg
6.909090909     |    Emp_4      |5.2    |Above Avg
7.361445783     |    Emp_5      |5.2    |Above Avg

Если AverageLoginHour сотрудника меньше Totalavg, чем .withcolumn Примечания как Ниже Avg else Выше Avg.

Пожалуйста, поделитесь своим предложением.

1 Ответ

1 голос
/ 04 августа 2020

Используйте avg во встроенной функции с предложением window для этого случая.

Example:

df.show()
//+----------------+--------+
//|AverageLoginHour|employee|
//+----------------+--------+
//|     3.392265193|   emp_1|
//|     2.833333333|   emp_2|
//|     5.638888889|   emp_3|
//|     6.909090909|   emp_4|
//|     7.361445783|   emp_5|
//+----------------+--------+


df.withColumn("Totalavg",avg(col("AverageLoginHour")).over()).
withColumn("Remarks",when(col("Totalavg") > col("AverageLoginHour"),lit("Below Avg")).otherwise(lit("Above Avg"))).
show()

//+----------------+--------+------------+---------+
//|AverageLoginHour|employee|    Totalavg|  Remarks|
//+----------------+--------+------------+---------+
//|     3.392265193|   emp_1|5.2270048214|Below Avg|
//|     2.833333333|   emp_2|5.2270048214|Below Avg|
//|     5.638888889|   emp_3|5.2270048214|Above Avg|
//|     6.909090909|   emp_4|5.2270048214|Above Avg|
//|     7.361445783|   emp_5|5.2270048214|Above Avg|
//+----------------+--------+------------+---------+

//rounding to 1
df.withColumn("Totalavg",round(avg(col("AverageLoginHour")).over(),1)).withColumn("Remarks",when(col("Totalavg") > col("AverageLoginHour"),lit("Below Avg")).otherwise(lit("Above Avg"))).show()
//+----------------+--------+--------+---------+
//|AverageLoginHour|employee|Totalavg|  Remarks|
//+----------------+--------+--------+---------+
//|     3.392265193|   emp_1|     5.2|Below Avg|
//|     2.833333333|   emp_2|     5.2|Below Avg|
//|     5.638888889|   emp_3|     5.2|Above Avg|
//|     6.909090909|   emp_4|     5.2|Above Avg|
//|     7.361445783|   emp_5|     5.2|Above Avg|
//+----------------+--------+--------+---------+

Другой способ будет без с использованием оконной функции и использования crossJoin.

Example:

val df1=df.selectExpr("avg(AverageLoginHour) as Totalavg")
df.crossJoin(df1).
withColumn("Remarks",when(col("Totalavg") > col("AverageLoginHour"),lit("Below Avg")).otherwise(lit("Above Avg"))).
show()
//+----------------+--------+------------+---------+
//|AverageLoginHour|employee|    Totalavg|  Remarks|
//+----------------+--------+------------+---------+
//|     3.392265193|   emp_1|5.2270048214|Below Avg|
//|     2.833333333|   emp_2|5.2270048214|Below Avg|
//|     5.638888889|   emp_3|5.2270048214|Above Avg|
//|     6.909090909|   emp_4|5.2270048214|Above Avg|
//|     7.361445783|   emp_5|5.2270048214|Above Avg|
//+----------------+--------+------------+---------+
...