私はScalaでSQLクエリを書き直そうとしています。私の条件に合った行をScalaで分ける方法は?
- ファイルはパイプで区切られています。
- フィールド
Message
は、ファイルの4番目の列にあります。 msg
のクエリがCSV(MESSAGE >>>
)のMessage
の3列目にあります。
サンプルファイルのデータ:
[06-26 00:01:52,036] | Container : 5 | INFO | relation ID: 00002ZaaaaaaXdsZb:-1:55609051-1879-4be8-b1c9-1d2006b17135, Message: acadeontroller.java recordLogRequest - 50 (...) , MESSAGE >>> API - XX_XX_XX {CHECKSUM=9ABF5975467E394F54442FBD4F6473D3,MEMBER_TYPE=}
問合せは、下記のようになります。
INSERT OVERWRITE TABLE staging.cleaned_data_7 SELECT * FROM staging.cleaned_data_6 WHERE msg NOT LIKE '%KEEP_ALIVE%' AND msg NOT LIKE '%XXX_CHANNEL_SERVICE%' AND msg NOT LIKE '%XXX Finished%' AND msg NOT LIKE '%API -%' ;
私は二つの方法を試してみました。最初の方法は、map
とfilter
を使用することです。これは、大文字小文字に一致するレコード全体を抽出できません。私はフィールドのみを抽出できます。そのSELECT *
クエリ以来、私はこれを使用することはできません。
val sample = sc.textFile("file:////home/user/sample.txt").map(x=>x.split('|')(3)).map(x=>x.split(',')(2))
val myFilter = sample.filter(x =>
!(x contains "KEEP_ALIVE") &&
!(x contains "XXX_CHANNEL_SERVICE") &&
!(x contains "XXX Finished") &&
!(x contains "API -"))
方法2:私はpartition
機能を使用しています。しかし、私はエラーに直面している。
val (valid,invalid) = readFile.partition{ line=>
val Message = line.split('|')(3).split(',')(2).toString
Message.filter(x =>
!(x contains "KEEP_ALIVE") &&
!(x contains "XXX_CHANNEL_SERVICE") &&
!(x contains "XXX Finished") &&
!(x contains "API -")
)
}
<console>:48: error: value contains is not a member of Char