Embulk에서 MySQL의 date형을 BigQuery에 보낸다. 2019-11-12

개요



Embulk에서 MySQL 데이터를 BigQuery로 보냅니다.
그때 MySQL date型 를 BigQuery date型 로 편하게 보내면 에러가 됩니다.
그 대응 등을 씁니다.

Embulk



Embulk 사용, 이전 준비 거리

MySQL 환경


% cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
% sudo apt-get install mysql-server-5.7 mysql-client-5.7
% mysqld --version
mysqld  Ver 5.7.27-0ubuntu0.18.04.1 for Linux on x86_64 ((Ubuntu))

검증에 사용되는 테이블


CREATE TABLE `example_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

드디어 몇 건의 데이터를 넣었다.
insert into example_table
(`date`)
values
('2018-03-27'),
('2018-04-30'),
('2018-05-01'),
('2018-12-31'),
('2019-01-01'),
('2019-03-27'),
('2019-04-30'),
('2019-05-01'),
('2019-12-31'),
('2020-01-01');
mysql> select * from example_table;
+----+------------+
| id | date       |
+----+------------+
|  1 | 2018-03-27 |
|  2 | 2018-04-30 |
|  3 | 2018-05-01 |
|  4 | 2018-12-31 |
|  5 | 2019-01-01 |
|  6 | 2019-03-27 |
|  7 | 2019-04-30 |
|  8 | 2019-05-01 |
|  9 | 2019-12-31 |
| 10 | 2020-01-01 |
+----+------------+

Embulk: MySQL -> BigQuery 설정 주위



필요한 플러그인 설치


% embulk gem install embulk-input-mysql
% embulk gem install embulk-output-bigquery

우선 설정 파일



다른 기사에서도 해설되고 있으므로 상세한 내용에 대해서는 생략합니다.

포인트
  • MySQL의 설정에서는 컬럼의 지정 만
  • BigQuery schema 설정에서 MySQL date型를 BigQuery에서도 date型
    config.yml
    in:
      type: mysql
      host: localhost
      user: USER_NAME
      password: PASSWORD
      database: DATABASE_NAME
      table: example_table
      select: id, date
    out:
      type: bigquery
      auth_method: json_key
      json_keyfile: JSON_KEY
      path_prefix: /tmp/
      file_ext: .csv.gz
      source_format: CSV
      project: PROJECT
      auto_create_dataset: true
      dataset: example_dataset
      auto_create_table: true
      table: bq_example_table
      schema_file: ./schema.json
      formatter: {type: csv, charset: UTF-8, delimiter: ',', header_line: false}
      encoders:
      - {type: gzip}
    

    scheme.json
    [
      {"name": "id", "type": "INTEGER", "mode": "required"},
      {"name": "date", "type": "DATE", "mode": "required"}
    ]
    

    본제의 Date형의 움직임을 검증



    위의 "일단 설정 파일"에서 실행해보십시오.



    오류로 실패합니다.

    오류의 원인을 로그에서 집어 들으면 다음 내용
    "Error while reading data, error message: Could not parse '2018-03-27 00:00:00.000000 +00:00' as date for field date (position 1) starting at location 0"
    BigQuery date型 의 컬럼에 2018-03-27 00:00:00.000000 +00:00 를 넣으려고 시간도 붙어 있기 때문에 에러가 된 모습.

    조금 설정을 바꿔야합니다.

    BigQuery의 날짜 열을 STRING으로 설정합니다.



    scheme.json
     [
       {"name": "id",   "type": "INTEGER", "mode": "required"},
    -  {"name": "date", "type": "DATE", "mode": "required"}
    +  {"name": "date", "type": "STRING", "mode": "required"}
     ]
    

    그렇게 하면, 일시적인 에러 없이 인서트 됩니다.



    다만 BigQuery에는 2018-03-27 00:00:00.000000 +00:00 라고 하는 캐릭터 라인으로서 들어갑니다.
    아래와 같이, 한 번 더 추가하면 기대대로 움직이는 것의 조금 어떻게든하고 싶은 기분이 됩니다.
  • cast
  • cast(substr(date, 0, 10) as DATE)

  • 범위 지정
  • where cast(substr(date, 0, 10) as DATE) between '2018-01-01' and '2018-12-31'


  • MySQL 결과 처리



    MySQL의 결과를 그대로 전달하면 시간도 달라붙는 것 같기 때문에, 조금 가공합니다.

    ( scheme.jsondate型 상태.)

    config.yml
       table: example_table
       select: id, date
    +  column_options:
    +    date: {type: string, timestamp_format: "%Y-%m-%d", timezone: "Asia/Tokyo"}
     out:
       type: bigquery
    

    date 를 YYYY-MM-DD 형식으로 해 줍니다.

    참고 : htps : // bg. 아다친. 메/아 r치ゔぇs/9196

    이제 BigQuery는 date型이고 값은 2018-03-27와 같은 값으로 좋은 느낌으로 삽입되었습니다.



    추가: output-bigquery 측에서 가공



    사고방식으로는 「MySQL의 결과를 가공」과 같습니다.
    output-bigquery측에서도 설정할 수 있게 된 것 같습니다. (자세한 것은 코멘트란 참조)

    「MySQL의 결과를 가공」과 마찬가지이므로 설정예만 기재합니다. out 에 설정을 추가합니다.

    config.yml
       formatter: {type: csv, charset: UTF-8, delimiter: ',', header_line: false}
       encoders:
       - {type: gzip}
    +  column_options:
    +  - {name: date, type: DATE, timezone: "Asia/Tokyo"}
    

    STRING 형 -> DATE 형으로 나오는 것 같은 영향



    우선 도망에서 "BigQuery의 date 컬럼을 STRING으로 해 버린다"로 운용하고 있었으므로, BigQuery측을 date型 로 하는 것으로 나오는 것 같은 영향에 대해 생각합니다.
  • 범위 지정
  • 오히려 지금까지보다 편해지기 때문에 특히 영향을 미치지 않을 것 같다

  • 시간대
  • DATE 型は、タイムゾーンに関係なく 라고 문서에 있으므로 생각하지 않아도 좋을 것 같다.
  • h tps : // c ぉ d. 오, ぇ. 이 m/비g 쿠에 ry/도 cs/레후에 렌세/s 단지 rdsql/다타-tyぺs? hl = 그럼
  • MySQL에서 꺼낼 때 타임 존을 올바르게 취급하면 OK

  • <그 외>
  • <무엇이 있으면 추가>


  • 요약



    Embulk에서 좋은 느낌으로 MySQL date型를 BigQuery date型로 보냈습니다.

    좋은 웹페이지 즐겨찾기