【Spark SQL】その月の月初の日を指定するクエリ

SparkSQLにはlast_day という指定した日の月の月末の日を返す関数があるのですが、月初の日を返す関数がありません。 そこで、月初の日を返すやり方はないのかと思い、試行錯誤してみました。 (前提条件として、時刻の環境はUTCを想定しているため、都度FROM_UTC_TIMESTAMP によってUTC+9に調整しています。)

方法1

DATE_ADD(TO_DATE(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo')), -(DAYOFMONTH(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo')) - 1))

こちらは、「その月の日から1引いた日」を「その月の日」から引くことによって実現する方法です。 例えば、10/18であれば、18 - (18 - 1) = 1という計算式になります。

ただ、これだと若干長くなってしまいました。他にも方法がないかと関数を見漁っていたところ、他にも方法がありました。

方法2

 TO_DATE(TRUNC(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo'), 'month'))

TRUNC という関数は、指定された単位で切り捨てを行なった日を返り値とする関数です。 例えば、2017-10-18の場合

TO_DATE(TRUNC(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo'), 'month'))2017-10-01 TO_DATE(TRUNC(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo'), 'year'))2017-01-01

となります。 これによって月初の日にちを取得することができます。

Ref

Elasticsearchをアップデートした際に生成されるjvm.options.rpmnewの扱いとJVMのチューニング

Elasticsearchを5.2.1から5.3にアップデートした時の話。

before

[root@ip-*** home]# curl localhost:9200
{
  "name" : "***",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "***",
  "version" : {
    "number" : "5.2.1",
    "build_hash" : "***",
    "build_date" : "***",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}

after

[root@ip-*** home]# curl localhost:9200
{
  "name" : "***",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "****",
  "version" : {
    "number" : "5.3.0",
    "build_hash" : "***",
    "build_date" : "***",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}

update後に/etc/elasticsearchを見て見ると、、

[root@ip-*** home]# cd /etc/elasticsearch
[root@ip-*** elasticsearch]# ll
total 32
-rw-rw---- 1 root elasticsearch 2878 Mar 29 07:22 elasticsearch.yml
-rw-rw---- 1 root elasticsearch 2896 Feb  7 08:54 jvm.options
-rw-rw---- 1 root elasticsearch 3117 Mar 23 03:34 jvm.options.rpmnew
-rw-rw---- 1 root elasticsearch 4456 Mar 23 03:34 log4j2.properties
drwxr-x--- 2 root elasticsearch 4096 Mar 23 03:34 scripts
-rw-r--r-- 1 root elasticsearch 2122 Feb  7 08:55 template.json
drwxr-x--- 2 root elasticsearch 4096 Mar 17 06:07 x-pack

となり、ここで発生した jvm.options.rpmnew というのは、新しいバージョンにおけるデフォルトの設定ファイルとなっています。 この新しいオプションは基本的に反映させておいた方が良さそうですね。

ここで新旧jvm.optionsのdiffを見てみます。

[root@ip-*** elasticsearch]# diff -u jvm.options jvm.options.rpmnew
--- jvm.options 2017-02-07 08:54:52.282685000 +0000
+++ jvm.options.rpmnew  2017-03-23 03:34:41.000000000 +0000
@@ -19,8 +19,8 @@
 # Xms represents the initial size of total heap space
 # Xmx represents the maximum size of total heap space

 ################################################################
 ## Expert settings
@@ -98,6 +98,13 @@
 # ensure the directory exists
 #-Xloggc:${loggc}

+# By default, the GC log file will not rotate.
+# By uncommenting the lines below, the GC log file
+# will be rotated every 128MB at most 32 times.
+#-XX:+UseGCLogFileRotation
+#-XX:NumberOfGCLogFiles=32
+#-XX:GCLogFileSize=128M
+
 # Elasticsearch 5.0.0 will throw an exception on unquoted field names in JSON.
 # If documents were already indexed with unquoted fields in a previous version
 # of Elasticsearch, some operations may throw errors.

diffを見る限り特に問題もなさそうですが、現状のオプションは残しておいたままにして新しい方を適用します。

$ cp jvm.options jvm.options.old
$ rm jvm.options
$ mv jvm.options.rpmnew jvm.options

ついでにヒープ領域の設定も変更

Elasticsearchのjvm.optionでは、デフォルトのXms及びXmxは2gですがインスタンスサイズの兼ね合いもあり、これを1gに変更します。

そして最後に再起動して設定が反映されます。

参考

1分でわかる.rpmnewの扱い方 · DQNEO起業日記

公式yumリポジトリで入れたElasticsearch 5.xの使用メモリを抑制するには - Qiita

JVMのチューニング - ITエンジニアとして生きる

「Java のヒープサイズ」についての簡単な説明

OpenCV2でお手軽顔認識

OpenCVを使った顔認識を試してみたのでメモ。

 

Enviroments

 

gistfb4ec23b44147bb5f088818ae3741354

 

やってることは

  1. カスケードフィルターの定義
  2. 画像の読み込み、モノクロに変換
  3. フィルターの特徴量を取得
  4. 認識実行

とシンプルな感じです。

 

認識の精度は(画像が荒いといった理由もあるのですが)高くはないので引き続き精度の高い人間の認識方法を模索中。。

 

 

余談ですがjupyterをgistに貼れるのは知りませんでした。便利。

 

Mixpanelのevent propertiesで、一つのpropertyが許容できる文字列長は255バイトまでだった

data

キーワード: mixpanel, size, max, len property, event property

 

mixpanelでトラッキングをする際、event propertyを定義出来るのですが、1つのpropertyが許容する文字の長さは255バイトまでだったということが分かりました。

 

実際に確認してみたコード(事前に「pip install mixpanel」が必要です)

gistc2d0f1a570f718a2f4c22ffc4d3edfc7

 

 

f:id:momota10:20170703230515p:plain

実際にログとして計測できたproperty。上のコードと比較するとデータが欠損しているのが分かります。

 

このことを知らずに1つのプロパティーに情報を突っ込みまくってたらデータに欠損が生じて分析が困難な状態になってしまいました。。辛い。

 

 

pythonでmixpanelを扱う概要は下記記載。

mixpanel.com

 

 

【Python】Seleniumを使ってTwitterにログインするスクリプトを書く

hidden meadow

Webブラウザのレンダリングエンジンを実装する必要があったので、練習がてらにSeleniumを使ったTwitterログインのスクリプトを作ってみました。

環境はMac & Python3です。

 

Selenium - Web Browser Automation

 

gist969d904b4cad239da2a5c00df1ad87e7

 

Seleniumを使うことによってWebサービスのテストやWebページのクローリング及びスクレイピングが可能となります。

 

いくつか覚えないといけないお作法もあったり、レンダリングエンジンの気持ちになる必要があったりと慣れていないと少し大変ではありますが使いこなせると面白いことができるのではないかと思いましたまる

 

 

インストール方法

1. Installation — Selenium Python Bindings 2 documentation

 

役立ったTips

4. Locating Elements — Selenium Python Bindings 2 documentation

5. Wait機能 — Selenium Pythonバインディング 2 ドキュメント

 

 

Redshiftで「Check 'stl_load_errors' system table for details.」と怒られた時

このSQLで原因が分かる

SELECT
  starttime,
  TRIM(colname),
  LENGTH(raw_field_value),
  err_code,
  TRIM(err_reason),
  raw_field_value
FROM stl_load_errors
ORDER BY starttime DESC LIMIT 20;

各エラーコードの詳細(日本語)は以下に記載されている。

docs.aws.amazon.com

mailgunのopenのイベントトラッキング(open, click)をユニークにする方法

Mailgun at Partner Palooza

 

mailgunのopenのイベントトラッキングをユニークにする方法を紹介します。

 

mailgunは、デフォルトではメールの開封(open)やメール内でのアクション(click)といったログは取得できませんが、コンソール画面で設定をする事によって取得することが出来るようになります。

 

が、以下の様なパターンがあったとします。

  1. Aさんへのメール送信をリクエストする
  2. メールが無事送信(Delivered)される
  3. Aさんはメールを開いた
  4. 後日、改めてAさんはメールを開いた

このとき、送信数1に対して開封数が2となってしまい、計測としては使えない状態となってしまいます。

 

これを防ぐためにはメールの開封トラッキングをユニークにする(=一意性を持たせる)必要があるのでが、これはタグ機能を使う事によって実現できます。

 

 

Railsで実装するには

railsでmailgunを使ってメール送信をする方法はいくつかありますが、今回はAction Mailerの機能をラップしたmailgun_railsというgemを使ってみます。

 

gist7724c4db8f518350e6c932455f174c3e

 

この様に、タグをオプションとしてつけてあげる事でメールが一意になり、求めている計測結果を得ることができます。

 

f:id:momota10:20170624194047p:plain

 

2つのメールアドレスに送り、それぞれ複数回開いたときの結果です。Unique OpenおよびOpenの二つのデータがきちんとトラッキングされています。

 

なお、この機能はmailgunのブログに記載がありましたので引用しておきます。

Simple open and click counters are not enough to determine how many users your messages are reaching since users often click or open messages multiple times. When you are using tags, we provide unique clicks and opens that give you an exact measurement of how many distinct users are engaging with the messages you are sending.

 

 

blog.mailgun.com

 

github.com

 

User Manual — Mailgun API documentation