SPARK:如何实现CASE ELSE部分和WHERE LIKE and BETWEEN



我有如下数据

hduser@ubuntu:~$ hadoop fs -cat /user/hduser/test_sample/sample1.txt
Eid1,EName1,EDept1,100
Eid2,EmpNm2,EDept1,102
Eid3,EName3,EDept1,101
Eid4,EName4,EDept2,110
Eid5,EName5,EDept2,121
Eid6,EName6,EDept4,99

我想得到如下的输出

Eid1,EName1,IT,100
Eid3,EName3,IT,101
Eid5,EName4,ComSc,110
Eid6,EName6,Other,99
现在在SQL的形式中我可以写
Select emp_id, emp_name, case when emp_dept='EDept1' then 'IT' 
when emp_dept='EDept2' then 'ComSc' else 'Other' end dept_name, emp_sal from emp 
Where emp_name like 'EName%' And emp_sal between 90 and 120
我的问题是1。如何实现CASE语句2的ELSE部分。如何实现where子句的LIKE部分如何实现between部分的where子句。

我不能使用sqlContext。SQL作为SQL也包含分析函数,目前spark-sql不支持分析函数

所以您可以创建这样一个UDF:

val deptUdf = udf[String,String]( dept =>
  dept match {
    case "EDept1" => "IT"
    case "EDept2" => "ComSc"
    case _ => "Other"
  }
)

一旦你这样做了,你可以在select语句中使用它。假设您在"deptCode"列中有一个带有您的部门名称的DataFrame,您可以这样做:

myDf.select(deptUdf($"deptCode") as "deptName")

对于第二部分和第三部分,您可以在过滤器中使用like函数,并且可以使用and实现between:

myDf.filter($"emp_name" like "EName%" and $"emp_sal" >= 90 and $"emp_sal" <= 120)

不使用sqlContext。我将继续使用HiveContext - HiveContext不需要hive安装,但它确实暴露了更多的hive udf。如果这对您不起作用,您还可以编写一个UDF来转换部门并将其注册到sqlContext中。

最新更新