GAミント至上主義

Web Monomaniacal Developer.

BigQuery(Legacy SQL)で年齢を5歳刻みにして取得する

Cloud Datastudioで年代別に処理をする際、下記のように年齢を5刻みのにして出しているのがあって、もっと短くしたくなったのでやってみた。

SELECT
case  
when age>= 10 and age < 15 then '10-14' 
when age>= 15 and age < 20 then '15-19' 
when age>= 20 and age <25 then '20-24' 
when age>= 25 and age <30 then '25-29' 
when age>= 30 and age <35 then '30-34' 
when age>= 35 and age <40 then '35-39' 
when age>= 40 and age <45 then '40-44' 
when age>= 45 and age <50 then '45-49' 
when age>= 50 and age <55 then '50-54' 
when age>= 55 and age <60 then '55-59' 
when age>= 60 and age <65 then '60-64' 
when age>= 65 and age <70 then '65-69' 
when age>= 70 and age <75 then '70-74' 
when age>= 75 and age <80 then '75-79' 
when age>= 80 and age <85 then '80-84' 
when age>= 85 and age <90 then '85-89' 
when age>= 90 and age <95 then '90-94' 
when age>= 95 and age <100 then '95-99' 
else 'その他' end as ages
FROM
  member
SELECT
  age,
  INTEGER(FLOOR(age/5) * 5) as age1,
  CONCAT( STRING(INTEGER(FLOOR(age/5) * 5 )), '-', STRING(INTEGER(FLOOR(age/5) * 5 ) + 4 )) as age2
FROM
  member
LIMIT
  1000

〇歳以上●歳以下の表示がちょっとてこずったけど、できてみるとシンプルだった。

Row	age	age1	age2	 
1	56	55	55-59	 
2	36	35	35-39	 
3	47	45	45-49	 
4	52	50	50-54	 
5	40	40	40-44	 
6	60	60	60-64	 
7	47	45	45-49	 
8	47	45	45-49	 
9	47	45	45-49	 
10	47	45	45-49	 

20代、30代のような10歳刻みであれば10で割って、floorして、10倍するだけでできる

SELECT
  age,
  FLOOR(age/10) * 10,
  CONCAT(STRING(INTEGER(FLOOR(age/10) * 10)), "代")
FROM
  member
LIMIT
  1000
Row	age	f0_	f1_	 
1	56	50.0	50代	 
2	36	30.0	30代	 
3	47	40.0	40代	 
4	52	50.0	50代	 
5	40	40.0	40代	 
6	60	60.0	60代	 

2017/8/16 GCP HTTP Load Balancerがしばらく502を返し続けた問題

朝起きたらoceanusの死活監視のメールがきてた。日本時間で8/16 1:18から4:29。

いつものBigQueryが落ちてたのかと思ってログを見たけど、アプリケーション側では目立ったエラーが見当たらなかった。

エラー時のレスポンスは502と下記内容。

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>502 Server Error</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Server Error</h1>
<h2>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.</h2>
<h2></h2>
</body></html>

アプリ側では502を返すことなんてない(ネットワーク内でRedis等につながらない時は503を返す)。

アプリ側で503など、エラーを返す時はもちろんログを残すが、ログは残っていない。

だから、ロードバランサーとGKE間の通信の問題だ。

HTTPロードバランサーのログをみると下記のような感じで502が並んでいた。

アプリや自分で用意したヘルスチェックのあるGKEまで到達していない。


f:id:uyamazak:20170816104523p:plain

GCPのインシデントにも見当たらなかった。

Google Cloud Status Dashboard



深夜帯でアクセス数も少ないので、大きな問題はないけど調査続行中。

GCP公式アイコンを使って資料を作る

自社データの収集活用プロジェクトのoceanusで、データスタジオを使い始めたり、複雑になってきたので全体図を書き直した。

アイコンや矢印は公式のGoogleスライド形式のアイコンがあったので、そちらからコピーしてGoogle図形描画で作成。普通にコピペで使えるので便利。

docs.google.com




そのほかの形式もこちらに用意されている。
cloud.google.com


↓これ
f:id:uyamazak:20170816160317p:plain