3

我正在尝试在IF左外部连接输出之上执行 [spark's coalesce],但似乎NULL没有按预期处理。这是我的基表、示例查询、输出和预期输出-

基表:

t1:
a,100
b,101
c,102

时间2:
101

询问:

select ax, a.x1, IF(b.x1 is NULL,a.x1,b.x1) from t1 a LEFT OUTER JOIN t2 b on a.x1=b.x1;

输出:

a,100,null
b,101,101
c,102,null

预期的:

a,100,100
b,101,101
c,102,102

我也尝试过包装上面的查询,然后在上面执行一个 IF。但没有成功。请建议我错过了什么。

4

2 回答 2

1

Try Case 语句,不确定 Spark SQL 是否支持此 CASE 语句:-

select a.x, a.x1,
      CASE WHEN b.x1 IS NULL THEN a.x1
           ELSE b.x1
      END as bx1
from t1 a LEFT OUTER JOIN t2 b on a.x1=b.x1;
于 2014-12-16T13:58:32.623 回答
1

这似乎工作

文件:tbl1

1   a
2   b
3   c

文件:tbl2

1   c
3   d

case class c_tbl1(c1: String,c2: String)

sc.textFile("tbl1").map { row => 
val parts = row.split("\t")
c_tbl1(parts(0),parts(1)) }.registerTempTable("t_tbl1")

case class c_tbl2(c1: String,c2: String)

sc.textFile("tbl2").map { row => 
val parts = row.split("\t")
c_tbl2(parts(0),parts(1)) }.registerTempTable("t_tbl2")

sqlContext.sql("""select t.c1,t.c2,IF(t2.c1 is null,1,2),t2.c2 from t_tbl1 t left outer join t_tbl2 t2 on t.c1=t2.c1""".stripMargin).collect.foreach(println)


[1,a,2,c]
[2,b,1,null]
[3,c,2,d]
于 2014-12-17T14:54:43.010 回答