Embulk에서 MySQL의 date형을 BigQuery에 보낸다. 2019-11-12
13777 단어 MySQLEmbulkubuntu18.04BigQuery
개요
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
우선 설정 파일
다른 기사에서도 해설되고 있으므로 상세한 내용에 대해서는 생략합니다.
포인트
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
우선 설정 파일
다른 기사에서도 해설되고 있으므로 상세한 내용에 대해서는 생략합니다.
포인트
% 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 gem install embulk-input-mysql
% embulk gem install embulk-output-bigquery
우선 설정 파일
다른 기사에서도 해설되고 있으므로 상세한 내용에 대해서는 생략합니다.
포인트
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
라고 하는 캐릭터 라인으로서 들어갑니다.
아래와 같이, 한 번 더 추가하면 기대대로 움직이는 것의 조금 어떻게든하고 싶은 기분이 됩니다.
[
{"name": "id", "type": "INTEGER", "mode": "required"},
- {"name": "date", "type": "DATE", "mode": "required"}
+ {"name": "date", "type": "STRING", "mode": "required"}
]
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.json
는 date型
상태.)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 型は、タイムゾーンに関係なく
라고 문서에 있으므로 생각하지 않아도 좋을 것 같다. 요약
Embulk에서 좋은 느낌으로 MySQL date型
를 BigQuery date型
로 보냈습니다.
Reference
이 문제에 관하여(Embulk에서 MySQL의 date형을 BigQuery에 보낸다. 2019-11-12), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/abetomo/items/b481e8f956f1837c48b2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Embulk에서 MySQL의 date형을 BigQuery에 보낸다. 2019-11-12), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/abetomo/items/b481e8f956f1837c48b2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)