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

时间:2015-05-22 07:44:37

标签: apache-spark

我有以下数据

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声明的ELSE部分2.如何实现LIKE部分的where子句3.如何在where子句的部分之间实现。

我不能使用sqlContext.sql,因为sql也包含分析函数,而截至目前,spark-sql不支持分析函数。

2 个答案:

答案 0 :(得分:1)

我没有使用sqlContext.sql而是继续使用HiveContext - HiveContext不需要安装配置单元,但它确实暴露了更多的配置单元UDF。如果这对你不起作用,你也可以编写一个UDF来转换部门并在sqlContext上注册它。

答案 1 :(得分:1)

所以你可以像这样创建一个UDF:

DrawTextEx

一旦这样做,您就可以在select语句中使用它。假设你在deptCode"中有一个带有dept名称的DataFrame。专栏,你可以这样做:

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

对于第二部分和第三部分,您可以在过滤器中使用myDf.select(deptUdf($"deptCode") as "deptName") 功能,并且可以使用like实施between

and