SPARK-SQLは初めてです。 SPARK SQL?
select case when 1=1 then 1 else 0 end from table
おかげでスリダール
Before Spark 1.2.0
サポートされている構文(Spark 1.0.2)で試したところ)は
SELECT IF(1=1, 1, 0) FROM table
この最近のスレッド http://Apache-spark-user-list.1001560.n3.nabble.com/Supported-SQL-syntax-in-Spark-SQL-td9538.html SQLパーサーへのリンクソース。これは、Scalaの使いやすさによっては役立つ場合とそうでない場合があります。少なくとも、70行目から(執筆時点で)始まるキーワードのリストが役立ちます。
便宜上、ソースへの直接リンクを次に示します。 https://github.com/Apache/spark/blob/master/sql/catalyst/src/main/scala/org/Apache/spark/sql/catalyst/ SqlParser.scala 。
Spark 1.2.0以降の更新
Spark 1.2.0の場合、 SPARK-381 : testで "CASE WHEN"を検索して、より伝統的な構文がサポートされます。 source 。例えば:
SELECT CASE WHEN key = 1 THEN 1 ELSE 2 END FROM testData
SQL Parserから構文を把握するための最新の場所の更新
これで、パーサーのソースを見つけることができます here 。
より複雑な例の更新
以下の質問に対する回答として、最新の構文は複雑なブール条件をサポートしています。
SELECT
CASE WHEN id = 1 OR id = 2 THEN "OneOrTwo" ELSE "NotOneOrTwo" END AS IdRedux
FROM customer
条件に複数の列を含めることができます。
SELECT
CASE WHEN id = 1 OR state = 'MA'
THEN "OneOrMA"
ELSE "NotOneOrMA" END AS IdRedux
FROM customer
CASE WHEN THEN式をネストすることもできます。
SELECT
CASE WHEN id = 1
THEN "OneOrMA"
ELSE
CASE WHEN state = 'MA' THEN "OneOrMA" ELSE "NotOneOrMA" END
END AS IdRedux
FROM customer
For Spark 2。+機能時のスパーク
ドキュメントから:
条件のリストを評価し、複数の可能な結果式の1つを返します。最後に定義されていない場合は、一致しない条件に対してnullが返されます。
// Example: encoding gender string column into integer.
// Scala:
people.select(when(people("gender") === "male", 0)
.when(people("gender") === "female", 1)
.otherwise(2))
// Java:
people.select(when(col("gender").equalTo("male"), 0)
.when(col("gender").equalTo("female"), 1)
.otherwise(2))
Based on my current production code, this works
val identifierDF =
tempIdentifierDF.select(tempIdentifierDF("t_item_account_id"),
when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_cusip")),100)
.when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_ticker")),100)
.when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_isin")),100)
.when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_sedol")),100)
.when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_valoren")),100)
.otherwise(0)
.alias("identifier_in_description_score")
)