我有以下数据
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不支持分析函数。
答案 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