web-dev-qa-db-ja.com

SPARK SQL-その場合のケース

SPARK-SQLは初めてです。 SPARK SQL?

select case when 1=1 then 1 else 0 end from table

おかげでスリダール

26
user3279189

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-381testで "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
44
Spiro Michaylov

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))
19
Ehud Lev
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")
    )
0