この項では、変換関数およびGroovyを使用して作成できる変換の様々なタイプの例を示します。
toString(pickup_datetime, 'yyyy-MM')
この例では、floor関数を使用してtrip_time_in_secsを分に変換します。
floor(trip_time_in_secs/60)
最初にtrip_time_in_secondsを60で除算し、データ転送の分数を決定します。次に、floor関数は、この数値の端数を切り捨て、doubleとして返します。
次のコードでは、diffDatesWithPrecision関数を使用して、pickup_datetimeまでの日数を計算します。
diffDatesWithPrecision(today(),pickup_datetime,DAYS)
today()は現在日付を取得し、pickup_datetimeは取得日であり、DAYSは結果を返す時間単位を指定します。
replace(cost,'\\$','')
trim(replace(pickup_county,'County',''))
このコードでは、メソッドのチェーンを使用して、単一の文で複数のアクションを実行しています。最初にreplaceがpickup_county属性内のCounty部分文字列を特定し、これを空白文字列('')に置き換え、実質的に削除します。次に、trimが、その結果から先頭および末尾の空白をすべて削除します。
次のコードでは、medallion属性内の数値を'X'に置き換えてマスキングします。
replace(medallion,'[0-9]','X')
replace関数は、文字の範囲を定義する正規表現[0-9]を使用してmedallion属性内の数値をすべて特定します。次に、このパターンと一致する任意の文字をString Xと置き換えます。
次のコードでは、extractKeyPhrasesカスタム変換関数(エンリッチメント関数の1つ)を使用してメッセージのタイトルおよび本文から語を抽出する方法を示します。この関数は、TF/IDFアルゴリズムを使用して主要語句を抽出します。このアルゴリズムでは、各語がString内に出現する合計回数を取得し、この値から、この語がより大きい処理本文内に出現する回数を相殺します。値を相殺することにより、"the"や"it"などの頻繁に使用される語をフィルタで除外しやすくなります。コントロールとして使用される処理本文は、Stringの言語に基づいて内部で選択されます。たとえば、英語に使用されるモデルはニューヨークタイムズのコーパスに基づいています。
extractKeyPhrases(concat(message_title,' ',message_body))
concatメソッドは、message_titleおよびmessage_bodyの値を、スペースで区切られた単一のStringに結合します。exTractKeyPhrasesは次に、主要語を新しいStringから抽出して返します。
def tagList = "WallMart\tWal-Mart\r\nWalMart\tWal-Mart\r\nWalMart\tWal-Mart\r\nCVS\r \nTarget\r\nSams\tSam'sClub\r\nSams Club\tSam's Club\r\nCostco\r \nMacys\tMacy's\r\nMacy's\r\nUlta\r\nTesco\r\nMetro\r\nSafeway" extractWhitelistTags(full_text,tagList,"en",true,false)指定された言語は英語(en)であり、照合では大文字と小文字が区別され(true)、バインドなしであるため、完全一致のみ(false)になります。
次のコードでは、2つの属性を使用してGeocodeオブジェクトを作成してから、Geocodeのcityフィールドを返します。
reverseGeotagGetCity(toGeocode(pickup_lat,pickup_long))
geotagAddress*関数は、有効な住所StringをGeocodeオブジェクトに変換します。データ・セットにはあいまいな住所や不完全な住所が含まれる可能性があるため、geotagAddress*関数には、より詳細な出力を取得するために国や地域などの複数のバリアントが用意されています。
ここでは、"Vernon, CA"という住所について考えてみます。この住所はあいまいです。なぜなら、"CA"はカナダとカリフォルニア州の両方の略語であるからです。また、カナダとカリフォルニア州の両方に"Vernon"という名前の市があります。この住所には郵便番号が含まれていないため、どちらが正しいヴァーノンであるかを確認できません。そのためには複数の処理方法があります。
geotagAddressGetRegion("Vernon,CA")
次の例では、カナダのブリティッシュコロンビア州ヴァーノンの国"CA"を返します。
geotagAddressGetCountry("Vernon,CA")
しかし、次の例では、米国のカリフォルニア州ヴァーノンに関する情報を返します。
geotagAddressGetCountry("Vernon,CA",["PREFERRED_LEVEL":"REGION"])
geotagAddressGetCountry("Vernon,CA",["STRICT_MODE":false])
geotagAddressGetCountry("Vernon,CA",["STRICT_MODE":true])
次のコードでは、if...else文を使用して、tip_amount属性の値に基づいてレコードにフラグを割り当てます。
// if the value of tip_amount is greater than 0, assign the record the 'Tip' flag:
if(tip_amount>0){
'Tip'
}
// if the above statement is false, assign the record the 'No Tip' flag:
else{
'No Tip'
}
次のコードでは、tip_amount属性に基づいて各レコードにフラグを割り当てます。ただし、このコードでは、一連のif...else文を使用して、各パーセント範囲に異なるフラグを割り当てます。
// if the tip was more than 25% of the total fare, assign the record the Large Tip flag:
if(tip_amount/fare_amount>.25){
'Large Tip'
}
// if the tip was less than or euqal to 25% and higher than 18%, assign the record the Standard Tip flag:
else if(tip_amount/fare_amount<=.25 || tip_amount/fare_amount>.18){
'Standard Tip'
}
// if the tip was less than or equal to 18%, assign the record the Small Tip flag:
else if(tip_amount/fare_amount<=.18 || tip_amount/fare_amount>0){
'Small Tip'
}
// if all of the above statements failed assign the record the No Tip flag:
else{
'No Tip'
}
この例では、前述の例と同じ操作を実行しますが、チップのパーセントを各文で計算するのではなく、変数を使用してチップのパーセントを格納します。
// calculate the tip percentage and assign it to PercentageTip
def PercentageTip = tip_amount/fare_amount
// if the value of PercentTip is greater than .25 (25%),
// assign the record the Large Tip flag
if(PercentTip>.25){
'Large Tip'
}
// if the value of PercentTip is less than or equal to .25 and higher than .18
// assign the record the Standard Tip flag
else if(PercentTip<=.25 && PercentTip>.18){
'Standard Tip'
}
// if the value of PercentTip is less than or equal to .18 and higher than 0
// assign the record the Small Tip flag
else if(PercentTip<=.18 && PercentTip>0){
'Small Tip'
}
// if all of the above statements failed assign the record the No Tip flag
else{
'No Tip'
}
次の例では、一連のelse...if文を使用して、複数割当値を作成します。ここでは、diffDatesWithPrecision関数を使用して、現在の日付と属性dropoff_datetime間の期間を日数として計算します。次に、レコードが収まる様々な範囲を指定するString値のリストをレコードに割り当てます。
if(diffDatesWithPrecision(dropoff_datetime,today(),'days')<=30){
toSet('Last 30 Days','Last 90 Days','Last 180 Days')
}
else if(diffDatesWithPrecision(dropoff_datetime,today(),'days')<=90){
toSet('Last 90 Days','Last 180 Days')
}
else if(diffDatesWithPrecision(dropoff_datetime,today(),'days')<=180){
toSet('Last 180 Days')
}
else{
toSet('Greater than 180 Days')
}
次の例は、複数割当値を処理する方法を示します。
ItemColor.collect
{toUpperCase(it)}
次のコードでは、medalsawardedと呼ばれる複数割当属性内の値を反復し、検出されたメダルのタイプごとに特定のポイント数を変数MedalValueに追加します。次に、属性内のメダルごとに付与された合計ポイント数が含まれるMedalValueを返します。
def MedalValue=0
for (int i in 0..cardinality(medalsawarded)-1) {
if(indexOf(medalsawarded[i],'Gold')>=0){
MedalValue=MedalValue+3;
}
else if(indexOf(medalsawarded[i],'Silver')>=0){
MedalValue=MedalValue+2;
}
else if(indexOf(medalsawarded[i],'Bronze')>=0){
MedalValue=MedalValue+1;
}
}
MedalValue
たとえば、MedalsAwarded['Gold','Silver','Gold']である場合、MedalValueの最終値は8になります。
def MedalValue=0
for (x in medalsawarded) {
if(indexOf(x,'Gold')>=0){
MedalValue=MedalValue+3;
}
else if(indexOf(x,'Silver')>=0){
MedalValue=MedalValue+2;
}
else if(indexOf(x,'Bronze')>=0){
MedalValue=MedalValue+1;
}
}
MedalValue
次のコードでは、PartIdentifierと呼ばれる複数割当属性を反復し、その識別番号をXに置き換えてマスキングします。
PartIdentifier.{collect(trim(replace(substring(it,1,10),'[0-9]','X')))}
上記の例では、メソッド・チェーンを使用して、単一の文でPartIdentifierの値に対して複数の操作を実行しています。文の最初の部分であるPartIdentifier.collectがcollectメソッドをPartIdentifier属性に対して呼び出します。collectは、PartIdentifier複数割当属性内の各値に対して最も外側の括弧セット内のコードを実行します。
collectは最初に、substringメソッドを呼び出します。このメソッドは、位置1から位置10までの文字によって定義されたString itの部分文字列を返します。itは、PartIdentifierの数値にわたる暗黙的なGroovy変数です。
この部分文字列はreplaceメソッドに渡されます。このメソッドは、すべての数値('[0-9]')をXに置き換えます。次に、trimメソッドが、マスキングされたStringを取得し、その先頭と末尾の空白をすべて削除します。