CONCAT & CAST & LPAD

Amazon Athenaで表題の関数について。Amazon Athenaに限った話ではなくSQLの話だけれども…。

■ 環境

  • Amazon Athena

■ きっかけ

やりたいこととしては単純に『カラムの値を連結したい』ということだけのはずだった。もうずっと単純なSQLしか書いていなかったのでここら辺の関数についていろいろ忘れておりはまってしまった。

■ CONCAT

文字列として連結したいんだから、”CONCAT“でいけるだろうと思い試してみたところ、下記のエラーが出た。

Error running query: SYNTAX_ERROR: line 1:185: Unexpected parameters (integer) for function concat. Expected: concat(array(E), E) E, concat(E, array(E)) E, concat(array(E)) E, concat(varchar)

あれ?と思いドキュメントを見ていると下記を発見。

Concatenating Arrays
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/concatenating-arrays.html

いややりたいことは”文字列“としての連結であって、配列の連結ではない。ということでこれは違う。もう一度エラーメッセージをよく見てみると下記の通り。

concat(varchar)

できるはずである。としばし考えて気がついた。対象のカラムの型が”int“であった。では”CAST“を挟めば良いのか。ということで下記のような感じになった。

select concat(cast(year as varchar), cast(month as varchar), cast(day as varchar)) ...

しかし得られた結果がこれでは微妙であった。”2018316“。”0“パディングしなければならない。”LPAD“の出番である。”LPAD“だから戻ってくるのは”varchar“だよね、と思い下記のように書き換えた。

select concat(cast(year as varchar), lpad(month, 2, '0'), lpad(day, 2, '0')) ...

実行すると下記のようなエラーが…。

Error running query: SYNTAX_ERROR: line 1:215: Unexpected parameters (integer, integer, varchar(1)) for function lpad. Expected: lpad(varchar(x), bigint, varchar(y))

これもエラーログをよく読んでみれば解決した。ここも”CAST“が必要であった。

最終的に下記で思い通りの結果を得られた。

select concat(cast(year as varchar), lpad(cast(month as varchar), 2, '0'), lpad(cast(day as varchar), 2, '0')) ...

以上。

複数条件のcount()

SQLにおいて表題を行いたい。

■ 環境

  • AWS Athena

■ count()

where句で絞ると複数queryを実行しなければならない。Athenaを使用している為、読み込むデータ量は少なくさせたい。というわけで1回のクエリで複数の条件の”count()“を取得したい。

下記の方法にて一度のqueryで取得することができた。”column1“カラムの数値で”count()“したい。

SELECT
  regist_date,
  count(1) as total,
  count(column1 < 10 or null) as count1,
  count(column1 >= 10 or null) as count2
FROM testtable
GROUP BY regist_date

ポイントは”or null“である。

下記のような結果が得られた。満足である。

+--------------+-------+--------+--------+
| regist_date  | total | count1 | count2 |
+--------------+-------+--------+--------+
| 2018-02-01   |    51 |     31 |     20 |
| 2018-02-02   |     8 |      6 |      2 |
  :
+--------------+-------+--------+--------+

以上。

■ 関連

count(distinct (case when … then … end))

複数のcount()の結果を四則演算

Athenaのpartition一覧

表題を単なるメモ。

■ 環境

  • AWS Athena

■ athena

AWS Athenaを使用し始めている。とりあえずCSVのデータを投入し触ってみている。で、キレイにパーティションが分かれそうなデータ構造なので年月毎でパーティションを分けている。テーブルを作成した時はこんな感じ。

CREATE EXTERNAL TABLE IF NOT EXISTS test.table1 (
  :
) PARTITIONED BY (
  year string,
  month string
)
  :
) LOCATION 's3://withsin/testtable/'
TBLPROPERTIES ('has_encrypted_data'='false');

この”s3://withsin/testtable/“配下に”2017/04/“といったディレクトリ(?)を掘って、日付毎にデータを投入している。パーティションは下記のように作成。

ALTER TABLE table1 ADD PARTITION (year='2017', month='04') location 's3://withsin/testtable/2017/04/';

パーティションをいくつか作っていて、このパーティションは作ったっけ?となってしまった…。作成済みのパーティション一覧を取得したかったが、`SHOW CREATE TABLE`では情報が得られなかった。また管理画面からも確認する項目が見つけられず。というわけでこれもクエリを実行する。

show partitions table1;

これで下記のような結果が得られた。

year=2017/month=04
year=2016/month=08
year=2017/month=01
  :

MySQLでパーティションは使ったことがないのだが、MySQLでも同じように取得できるのであろう。

以上。

■ 関連

partition削除