注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

構文とサポートされている関数

式ボードの概要については、式ボードの使用ガイドを参照してください。このドキュメントは、Contour の豊富な式言語を使用するための資料であり、データ型、操作、関数のリファレンスとして使用できます。


データ型

式では、次のデータ型を使用できます。

文字列

文字列は単一引用符で囲んで表します。

'This is a string'

これは文字列です

文字列内の単一引用符をエスケープするには、単一引用符をもう1つ追加します。

'I''m a string'

私は文字列です

|| 演算子を使用して、列を文字列として連結します。

"Gender" || "MaritalStatus"

列と定数を連結することもできます。

'$' || ("salaryColumn"/1000.0) || 'k'

Integer

Integer は浮動小数点数ではない数値です。

5

Double

Double は浮動小数点数です。

5.7

ブール値

ブール変数は true または false のいずれかです。ブール変数では大文字と小文字が区別されません。

日付

YYYY-MM または YYYY-MM-DD 形式の文字列を日付にキャストできます。

CAST('2016-12-06' AS DATE)

文字列をタイムスタンプにキャストすることもできます。

CAST('2016-12-06 01:12:34' AS TIMESTAMP)

タイムスタンプを使って操作を行う場合は、まずタイムスタンプを Long にキャストするか、ミリ秒単位の精度が必要な場合は Double にキャストすると簡単です。これにより、UNIX 時間の秒数になります。

たとえば、「start」と「end」という2つのタイムスタンプ列があるとします。2つの時刻の間の分数を求めるには、次の式を使用できます。

(CAST("end" as LONG) - CAST("start" as LONG)) / 60。

Long をタイムスタンプにキャストする場合、Long の値は秒単位であると想定されます。データがミリ秒単位の場合は、キャストする前に1000で除算します。


操作

次のセクションでは、式で使用できる操作とその優先順位の概要を説明します。

算術

数値列(Integer または Double)に対して、ほかの数値列または定数を使って加算、減算、乗算、除算を行います:+、-、*、/

  • "tipAmount" / "fare"
  • "diameter" * 3.14

比較

>(より大きい)、>=(以上)、<(より小さい)、<=(以下)を使用して、任意のデータ型の列をほかの列や定数と比較します。結果はブール値の列になります。

  • "age" > "averageAge"
  • "totalDistance" < 5

2つの文字列を比較する場合、Contour は辞書順を使用します。数値を含む文字列を比較する場合、直感に反する結果になることがあります。たとえば、次のようになります。

  • 'Alligator' < 'Boat' => TRUE となります。'A' のエンコード値が 'B' のエンコード値より小さいためです。
  • 'Alliance' < 'Alligator' => TRUE となります。'a' が 'g' より小さいためです。
  • 'Zoo' < 'alpha' => TRUE となります。'Z' が 'a' より小さいためです。
  • 'Zoo' < 'Zoologist' => TRUE となります。一方の文字列がもう一方の接頭辞である場合、短い方が小さいと見なされるためです。
  • '1' < '2' => TRUE となります。文字列の文字 '1' が文字列の文字 '2' より小さいためです。
  • '10' < '2' => TRUE となります。最初の文字列の文字 '1' が文字列の文字 '2' より小さいためです。これは文字列 '10' と '2' の比較であり、整数10と2の比較ではありません。
  • '10' < '20' => TRUE となります。'1' が '2' より小さいためです。

等価比較

== を使用して、行の2つの列に同じ値があるかを確認するか、!= を使用して異なる値があるかを確認します。

  • "cityOfBirth" == "cityOfResidence"

列の値を定数と比較することもできます。

  • "Gender" == 'M'
Spark SQL との動作の違い

Contour の式言語では、NULL との等価比較は次のように動作します。

  • NULL = 'DATA' => FALSE
  • NULL != 'DATA' => TRUE
  • NULL = NULL => TRUE
  • NULL != NULL => FALSE

ただし、Spark SQL では、これらの式はすべて NULL を返します。Contour の式と Spark SQL の間で変換する場合、一貫した結果を生成するには、この動作の違いを考慮することが重要です。

ブール比較

ブールロジックを使って1列以上を評価し、新しいブール値の列を導出します。

  • "Age" >=70 AND "Gender" = 'M'

キャスト

キャストを使用すると、列または式のデータ型を変更できます。ブール値、Integer、Double、日付、タイムスタンプにキャストできます。

  • CAST("startDate" AS DATE)
  • CAST("startTime" AS TIMESTAMP)
  • CAST("numParticipants" AS INTEGER)

Case/When/End

Case 文を使用すると、1つの式で複数の条件を評価できます。各文は順番に評価され、最初に true と評価された文の THEN 文が実行されます。

Copied!
1 2 3 4 5 CASE WHEN "age" < 13 THEN 'Child' WHEN "age" > 19 THEN 'Adult' ELSE 'Teenager' END
Copied!
1 2 3 4 5 CASE MaritalStatus WHEN 'S' THEN 'Single' WHEN 'M' THEN 'Married' ELSE 'Unknown' END

Like

列内で指定されたパターンを検索します。詳しくは、SQL LIKE ↗ のドキュメントを参照してください。

null チェック

値が IS NULL または IS NOT NULL であるかを確認します。ブール値を返します。

優先順位

次のリストは、式内の操作の優先順位を高い順に示しています。同じ行にある操作はすべて同じ優先順位です。

  1. +, -, NOT(単項)
  2. ||(二項)
  3. *, /, %(二項)
  4. +, -(二項)
  5. <, <=, >, >=(二項)
  6. =, ==, !=, <>, IS, IS NOT, LIKE, RLIKE(二項)
  7. IS NULL, NOT NULL(単項)
  8. IN, NOT IN
  9. AND(二項)
  10. OR(二項)

関数

列の式で利用可能なすべての関数を以下に示します。

数学・数値関数

  • ABS:絶対値を計算します。
  • CBRT:指定された値の立方根を計算します。
  • CEIL:指定された値の天井値を計算します。
  • COS:指定された値の余弦を計算します。
  • EXP:指定された値の指数関数の値を計算します。
  • FACTORIAL:指定された値の階乗を計算します。
  • FLOOR:指定された値の床値を計算します。
  • FORMAT_NUMBER:数値列 arg0 を小数点以下 arg1 桁に丸めて「#,###,###.##」のような形式に整形し、結果を文字列列として返します(注:arg1 は整数リテラルである必要があります)。
  • ISNAN:列が NaN の場合にのみ true を返します。
  • LN:指定された値の自然対数を計算します。
  • LOG:arg0 を底とする arg1 の対数を計算します(注:arg0 は数値リテラルである必要があります)。
  • POW:arg0 を arg1 乗した値を返します。
  • RAND:指定されたシード arg0 に基づいて、行ごとに0から1の間の乱数を返します。
  • ROUND:arg0 を小数点以下 arg1 桁に丸めた値を返します(注:arg1 は整数リテラルである必要があります)。
  • RTRIM:指定された文字列値の右端から空白を削除します。
  • SIN:指定された列の正弦を計算します。
  • SQRT:指定された Float 値の平方根を計算します。
  • TAN:指定された値の正接を計算します。

文字列関数

name 列を参照する例では、その列に値 Jane が含まれていることを前提としています。

  • CONCAT:複数の入力文字列列を連結して、1つの文字列列にします。たとえば、firstName が Jane、lastName が Doe の場合、CONCAT("firstName", "lastName") は JaneDoe を返します。
  • CONCAT_WS:指定された区切り文字を使用して、複数の入力文字列列を連結し、1つの文字列列にします(注:arg0 は文字列リテラルである必要があります)。たとえば、firstName が Jane、lastName が Doe の場合、CONCAT_WS(' ', "firstName", "lastName") は Jane Doe を返します。
  • FORMAT_STRING:Java Formatter ↗ に従って引数を整形し、結果を文字列列として返します。たとえば、salary が 1234.5 の場合、FORMAT_STRING('%.2f', "salary") は 1234.50 を返します。
  • LENGTH:指定された文字列列またはバイナリ列の長さを計算します。たとえば、LENGTH("name") は 4 を返します。
  • LEVENSHTEIN:2つの文字列列間の編集距離を計算します。たとえば、wordA が kitten、wordB が sitting の場合、LEVENSHTEIN("wordA", "wordB") は 3 を返します。
  • LOWER:文字列列を小文字に変換します。たとえば、LOWER("name") は jane を返します。
  • LPAD:文字列 arg2 で左側を埋めて長さを arg1 にした文字列列 arg0 を返します(注:arg1 は整数リテラル、arg2 は文字列リテラルである必要があります)。たとえば、id が 42 の場合、LPAD("id", 5, '0') は 00042 を返します。
  • LTRIM:指定された文字列値の左端から空白を削除します。たとえば、name が Jane の場合、LTRIM("name") は Jane を返します(先頭の空白が削除されます)。
  • REGEXP_EXTRACT:文字列列 arg0 を正規表現 arg1 と照合し、特定のグループ arg2(1始まり)を抽出します。正規表現が一致しなかった場合、または指定されたグループが一致しなかった場合は、空の文字列を返します。(注:arg1 は文字列リテラル、arg2 は整数リテラルである必要があります)。たとえば、email が jane@example.com の場合、REGEXP_EXTRACT("email", '([^@]+)@', 1) は jane を返します。
  • REGEXP_REPLACE:arg0 内の arg1 に一致するすべてのテキストを arg2 に置換します。たとえば、phone が 555-1234 の場合、REGEXP_REPLACE("phone", '[^0-9]', '') は 5551234 を返します。
  • REVERSE:文字列列を逆順にし、新しい文字列列として返します。たとえば、REVERSE("name") は enaJ を返します。
  • RPAD:文字列 arg2 で右側を埋めて長さを arg1 にした文字列列 arg0 を返します(注:arg1 は整数リテラル、arg2 は文字列リテラルである必要があります)。たとえば、code が AB の場合、RPAD("code", 5, '*') は AB*** を返します。
  • SPLIT:正規表現文字列 arg1 を区切りとして文字列列 arg0 を分割し、区切り文字ごとに列を返すのではなく、1つの配列列を返します(注:arg1 は文字列リテラルである必要があります)。arg1 は正規表現であるため、正規表現の特殊文字を文字どおりに一致させるには、エスケープします。特殊文字を使用して列を分割するを参照してください。たとえば、fullName が Jane Doe の場合、SPLIT("fullName", ' ') は配列 ['Jane', 'Doe'] を返します。
  • SUBSTRING:インデックス arg1(1始まり)から始まる長さ arg2 の arg0 の部分文字列を返します(注:arg1 と arg2 は整数リテラルである必要があります)。たとえば、SUBSTRING("name", 1, 3) は Jan を返します。
  • TRIM:指定された文字列列の両端から空白を削除します。たとえば、name が Jane の場合、TRIM("name") は Jane を返します。
  • UPPER:文字列列を大文字に変換します。たとえば、UPPER("name") は JANE を返します。

日付/時刻関数

相対日付の導出に関する詳細と例については、相対日付の導出に関するリファレンスドキュメントを参照してください。

  • ADD_MONTHS: arg0 の arg1 か月後の日付を返します(注:arg1 は整数リテラルである必要があります)。
  • CURRENT_DATE: 現在の日付を日付列として返します。これらの値は、パスが再計算されたときにのみ更新されます。ボード間で値が不一致にならないように、パスを毎日更新することを推奨します。
  • CURRENT_TIMESTAMP: 現在のタイムスタンプをタイムスタンプ列として返します。これらの値は、パスが再計算されたときにのみ更新されます。
  • CURRENT_UNIX_TIMESTAMP: 現在のタイムスタンプを秒単位の数値として返します。これらの値は、パスが再計算されたときにのみ更新されます。
  • DATE_ADD: arg0 の arg1 日後の日付を返します(注:arg1 は整数リテラルである必要があります)。
  • DATE_FORMAT: 日付/タイムスタンプ arg0 を、arg1 で指定された形式の文字列に変換します(注:arg1 は文字列リテラルである必要があります)。
  • DATE_SUB: Java SimpleDateFormat ↗ に従って、arg0 の arg1 日前の日付を返します(注:arg1 は整数リテラルである必要があります)。
  • DATE_TRUNC: 日付/タイムスタンプ arg1 を、形式 arg0 で指定された単位に切り詰めて返します。
  • DATE_DIFF: arg1 から arg0 までの日数を返します。
  • DAY_OF_MONTH: 指定された日付/タイムスタンプ/文字列から、月内の日を整数として抽出します。
  • DAY_OF_WEEK: 指定された日付/タイムスタンプ/文字列から、曜日を整数として抽出します。値の範囲は、日曜日を表す1から土曜日を表す7までです。
  • DAY_OF_YEAR: 指定された日付/タイムスタンプ/文字列から、年内の通算日を整数として抽出します。
  • FROM_UTC_TIMESTAMP: UTC の特定の時刻に対応するタイムスタンプ列 arg0 を指定すると、指定されたタイムゾーン arg1 で同じ時刻に対応する別のタイムスタンプを返します(注:arg1 は文字列リテラルである必要があります)。
  • HOUR: 指定された日付/タイムスタンプ/文字列から、時を整数として抽出します。
  • LAST_DAY: 日付列を指定すると、その日付が属する月の最終日を返します。
  • MINUTE: 指定された日付/タイムスタンプ/文字列から、分を整数として抽出します。
  • MONTH: 指定された日付/タイムスタンプ/文字列から、月を整数として抽出します。
  • MONTHS_BETWEEN: 日付 arg0 と arg1 の間の月数を返します。
  • QUARTER: 指定された日付/タイムスタンプ/文字列から、四半期を整数として抽出します。
  • SECOND: 指定された日付/タイムスタンプ/文字列から、秒を整数として抽出します。
  • TO_UNIX_TIMESTAMP: 時刻文字列 arg0 を指定されたパターン文字列 arg1 で変換し、変換に失敗した場合は null を返します(注:arg1 は文字列リテラルである必要があります)。
  • TO_UTC_TIMESTAMP: 指定されたタイムゾーン arg1 の特定の時刻に対応するタイムスタンプ列 arg0 を指定すると、UTC で同じ時刻に対応する別のタイムスタンプを返します(注:arg1 は文字列リテラルである必要があります)。
  • WEEK_OF_YEAR: 指定された日付/タイムスタンプ/文字列から、ISO 週 ↗の番号を整数として抽出します。
  • YEAR: 指定された日付/タイムスタンプ/文字列から、年を整数として抽出します。

配列関数

配列関数に関する詳細と例については、配列関数に関するリファレンスドキュメントを参照してください。

  • ARRAY: すべての入力列から配列を作成します。
  • ARRAY_CONTAINS: 配列列 arg0 に値 arg1 が含まれる場合に true を返します(注:arg1 はリテラルである必要があります)。
  • ARRAY_GET_AT_INDEX: 配列列 arg0 からインデックス arg1(1始まり)の要素を返します(注:arg1 は整数リテラルである必要があります)。後続のボードでこの列を使用するには、この関数の結果を明示的にキャストします。
  • ARRAY_LENGTH: 指定された配列の長さを返します。入力が null の場合は -1 を返します。
  • ARRAY_JOIN: 配列列 arg0 を区切り文字列 arg1 で結合した文字列を返します(注:arg1 は文字列リテラルである必要があります)。
  • ARRAY_SORT: arg1 が true の場合は入力配列 arg0 を昇順で、arg1 が false の場合は降順で並べ替えます(注:arg1 はブールリテラルである必要があります)。
並べ替え列で値が重複すると、結果が非決定論的になることがあります

ウィンドウ関数で ROW_NUMBER、FIRST、LAST、ARRAY_AGG、または ARRAY_AGG_DISTINCT を使用する場合は、非決定性に注意してください。列 A でパーティション分割し、列 B で並べ替える場合を考えます。同じ列 A の値に対して、列 B の値が同じ行が複数あると、これらのウィンドウ関数の結果は非決定論的になる可能性があります。つまり、同じ入力データとロジックでも、異なる結果が生成される場合があります。

ウィンドウ関数

ウィンドウ関数には OVER 句が必要です。詳細と例については、ウィンドウ関数に関するリファレンスドキュメントを参照してください。

  • CUME_DIST: ウィンドウパーティション内の値の累積分布、つまり現在の行より下にある行の割合を返します。
  • DENSE_RANK: ウィンドウパーティション内の行の順位を、欠番なしで返します。
  • EXPLODE: 指定された配列列の要素ごとに新しい行を作成し、null を含む行を削除します。後続のボードでこの列を使用するには、この関数の結果を明示的にキャストします。
  • EXPLODE_OUTER: 指定された配列列の要素ごとに新しい行を作成します。後続のボードでこの列を使用するには、この関数の結果を明示的にキャストします。
  • FIRST: グループ内の最初の値を返します。
  • LAG: 列 arg0 で現在の行から arg1 行前の値を返し、現在の行より前の行数が arg1 より小さい場合は null を返します。たとえば、arg1 が1の場合、ウィンドウパーティション内のどの位置でも、前の行を返します(注:arg1 は整数リテラルである必要があります)。
  • LAST: グループ内の最後の値を返します。
  • LEAD: 列 arg0 で現在の行から arg1 行後の値を返し、現在の行より後の行数が arg1 より小さい場合は null を返します。たとえば、arg1 が1の場合、ウィンドウパーティション内のどの位置でも、次の行を返します(注:arg1 は整数リテラルである必要があります)。
  • NTILE: 並べ替えられたウィンドウパーティション内の ntile グループID(1以上 arg0 以下)を返します。たとえば、arg0 が4の場合、最初の4分の1の行には値1、次の4分の1には2、その次の4分の1には3、最後の4分の1には4が割り当てられます(注:arg0 は整数リテラルである必要があります)。
  • PERCENT_RANK: ウィンドウパーティション内の行の相対順位(つまりパーセンタイル)を返します。
  • RANK: ウィンドウパーティション内の行の順位を返します。
  • ROW_NUMBER: ウィンドウパーティション内で1から始まる連番を返します。

集計関数

集計関数は、集計式およびウィンドウ関数で使用できます。

  • ARRAY_AGG: 入力列から集計された値の配列を返します。
  • ARRAY_AGG_DISTINCT: 入力列から集計された重複のない値の配列を返します。
  • AVG: グループ内の値の平均を返します。
  • COUNT: グループ内の項目数を返します。
  • COUNT_DISTINCT: グループ内の項目数を返します(注:式ボードの集約オプションでのみ使用できます。新しい列を追加、フィルター、または列の置き換えでは使用できません)。
  • CORR: 2列のピアソン相関係数を返します。
  • MAX: グループ内の式の最大値を返します。
  • MEAN: グループ内の値の平均を返します。
  • MIN: グループ内の式の最小値を返します。
  • STDDEV: グループ内の式の標本標準偏差を返します。
  • SUM: 式内のすべての値の合計を返します。
  • SUM_DISTINCT: 式内の重複のない値の合計を返します(注:ウィンドウ関数では使用できません)。
  • VARIANCE: グループ内の値の不偏分散を返します。

その他の関数

  • COALESCE:null ではない最初の列を返します。すべての入力が null の場合は null を返します。
  • GREATEST:null 値をスキップし、値のリストの最大値を返します。
  • HASH:指定した列のハッシュコードを計算し、結果を int 型の列として返します。
  • ISNULL:列が null の場合に限り、true を返します。
  • LEAST:null 値をスキップし、値のリストの最小値を返します。
  • MD5:バイナリ列の MD5 ダイジェストを計算し、値を32文字の16進文字列として返します。
  • MONOTONICALLY_INCREASING_ID:単調増加する ID を返します。これらの値は、パスが計算されるたびに変わる可能性があります。
  • SHA1:バイナリ列の SHA-1 ダイジェストを計算し、値を40文字の16進文字列として返します。
  • GET_JSON_OBJECT:指定した JSON パス ↗に基づいて JSON 文字列から JSON オブジェクトを抽出し、抽出した JSON オブジェクトの JSON 文字列を返します。パスの例は次のとおりです。
    • $.field
    • $['field']