2017-08-25 30 views
0

私はawsで、ログファイルの束を解析するためにathenaを使用しています。照会の基準は、base64でエンコードされたサブストリングです。 ( "adId = eW0vMU0zeGE5NUE4NjcyLzYzNDgvalhkVGhkZmxfODQwS182NDB4MzYwLm1wNAo =%somejunk")sqlクエリのbase64サブ文字列

私の知る限り、このクエリに問題はありません。

SELECT count(*) 
FROM reporting."logs" 
WHERE sc_status NOT LIKE '404' 
     AND cs_cookie LIKE 'adId%' 
     AND cs_uri_stem LIKE'%.m3u8' 
     AND FROM_UTF8(from_base64(regexp_extract(cs_cookie, '(adId=)([^ ]+?)\%(.*)',2))) LIKE '%mp4' limit 1 ; 

それは私にエラーINVALID_FUNCTION_ARGUMENT与える:

5F不正base64で文字異なるバージョンを、すべてのコンポーネントを使用して、エラーを返し、私にMP4で終わる値を与えるものではありません。

SELECT FROM_UTF8(from_base64(regexp_extract(cs_cookie, '(adId=)([^ ]+?)\%(.*)',2))) 
FROM reporting."logs" 
WHERE sc_status NOT LIKE '404' 
    AND cs_cookie LIKE 'adId%' 
    AND cs_uri_stem LIKE'%.m3u8' limit 1 ; 

戻り値には実際には奇妙なものはありません。

ym/1M3xa95A8672/6348/jXdThdfl_840K_640x360.mp4 

なぜ私はエラーが発生するのですか、これをフォーマットする方法についてのアイディアはありますか?

+0

作業バージョン:https://docs.oracle.com/javase/8/docs/api/java/ util/Base64.html –

答えて

0

URLであったため、安全でない文字があるように見えます。

いくつかの無効なbase64文字を置き換える必要がありました。

base64の機能はJava Base64エンコーディングに建てへの直接パススルーとして実装されて

SELECT * 
FROM reporting."logs" 
WHERE sc_status LIKE '2__' 
AND date(date) = current_date - interval '1' day 
     AND cs_cookie LIKE 'adId%' 
     AND cs_uri_stem LIKE'%ad.m3u8' 
     AND FROM_UTF8(from_base64(replace(replace(regexp_extract(cs_cookie, '(adId=)([^ ]+?)\%(.*)',2), '_','/'),'-','+'))) LIKE '%mp4'