2016-11-10 5 views
2

私は、Scalaを使用してSPARK SQLに簡単なCASE-WHEN-THEN句を実装する方法を知っています。私はバージョン1.6.2を使用しています。しかし、CASE-WHEN節の中の複数の列に対してAND条件を指定する必要があります。 Scalaを使ってSPARKでこれを達成する方法は?SPARK SQL:CASE文内にAND条件を実装します。

お時間をいただきありがとうございます。データフレームとして

select sd.standardizationId, 
    case when sd.numberOfShares = 0 and 
      isnull(sd.derivatives,0) = 0 and 
      sd.holdingTypeId not in (3,10) 
     then 
      8 
     else 
      holdingTypeId 
     end 
    as holdingTypeId 
from sd; 
+2

は、そのクエリの仕事をしていますか?そうでない場合は、どのようなエラーがありますか?私たちに推測させないでください。 [mcve] –

答えて

0

代替オプション、完全な文字列式を使用して避けたかっただ場合は、次のとおりである。

import org.apache.spark.sql.Column 
import org.apache.spark.sql.functions._ 

val sd = sqlContext.table("sd") 

val conditionedColumn: Column = when(
    (sd("numberOfShares") === 0) and 
    (coalesce(sd("derivatives"), lit(0)) === 0) and 
    (!sd("holdingTypeId").isin(Seq(3,10): _*)), 8 
).otherwise(sd("holdingTypeId")).as("holdingTypeId") 

val result = sd.select(sd("standardizationId"), conditionedColumn) 
2

最初の読み出しテーブル

val table = sqlContext.table("sd") 

が続いて表現して選択します。

は、ここで私が持っているSQLクエリです。あなたのデータベースに従って構文を整列させます。

val result = table.selectExpr("standardizationId","case when numberOfShares = 0 and isnull(derivatives,0) = 0 and holdingTypeId not in (3,10) then 8 else holdingTypeId end as holdingTypeId") 

そしてショーの結果

result.show 
+0

を参照してください。ちょうど不思議なことに、これが機能している場合、質問の上記のクエリも機能します...そうですか?これら2つの違いは何ですか? – Shankar

+0

最初の例では、それはsqlとして使用され、テーブルをクエリし、データフレームを作成する(同じ方法で作成者が使用されている)と、 "not in"で解析例外が発生するはずです。 2番目の例では、すでにテーブルから作成されたデータフレームに適用された選択とその操作は、構文サポートによって例外を解析するだけです。 – FaigB

+0

ありがとう@FaigB!それはトリックでした! – Prash

関連する問題