読者です 読者をやめる 読者になる 読者になる

無気力生活 (ノ ´ω`)ノ ~゜

脱力系エンジニア。てきとーに生きてます。

embulkでBigqueryにテキストデータ流し込めなかった話

ユーザーメッセージを分析するようにBigqueryに流し込んでたんですが、とある日Slackに失敗通知が飛んでいることに気づく

Error: org.jruby.exceptions.RaiseException: (Error) failed during waiting a Load job, get_job(to_aru_server, embulk_load_job_000f1d44
-0935-4cf7-84a9-e00aac16995e), errors:[{:reason=>"invalid", :message=>"Too many errors encountered."}, {:reason=>"invalid", :message=>"CSV
table references column position 2, but line starting at position:147 contains only 2 columns.", :location=>"file-00000000"}]
2017-03-09 06:00:38 +0900 [ERROR] (0017@+fetch_table+fetch_yesterday^sub+for-table=messages) io.digdag.core.agent.OperatorManager: Task failed with unexpected error: Command failed with code 1
java.lang.RuntimeException: Command failed with code 1

なんぞこれ。設定周りに不備があると思って色々調べたんですが、原因が特定できず。 弊社のBigquery師範から、流し込んでるデータに問題あるんじゃないかの指摘を受け、調べてみたら改行を含んだユーザーコメントがいるわけでして(ヽ´ω`)

改行を含んだカラムを扱うときは、--allow-quoted-newlinesが必要とのことなので、liquidにオプション追加すると解消できました

in:
{% include 'common_in' %}
  query: |
    SELECT
      id,
      text,
      created_at
    FROM messages
    WHERE id > 1 
      AND created_at >= "{{ env.TARGET_DATE }}"
      AND created_at < DATE_ADD("{{ env.TARGET_DATE }}", INTERVAL 1 DAY)
out:
{% include 'common_out' %}
  table: messages{{ env.TARGET_DATE | date: "%Y%m%d" }}
  schema_file: embulk/messages.json
  path_prefix: /tmp/messages
  allow_quoted_newlines: 1 # <--------これ
  formatter:
    type: csv
    charset: UTF-8
    delimiter: ','
    header_line: false
    column_options:
      created_at: { format: "%Y-%m-%d %H:%M:%S" }