bq 명령으로 schema_update_option을 지정하면 열 추가 작업이 쉽습니다.
요약
ALLOW_FIELD_ADDITION
를 지정하면, 컬럼이 추가되었을 경우에서도, 별도 table의 schema update 작업을 하지 않아도 된다고 하는 이야기. 실험한 환경
테이블 이름
테이블 작성 명령
bq mk --table --require_partition_filter --time_partitioning_type=DAY 'project_id:dataset_id.foobar'
Day 1
일반적으로 다음과 같이 Load되어 있다고 합니다.
테이블 스키마
foobar.schema1.json[
{
"mode": "NULLABLE",
"name": "a",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "b",
"type": "INTEGER"
}
]
투입 데이터
foobar1.csv
"a","b"
"abc",1
"xyz",9
Load 명령
bq load \
--source_format=CSV --skip_leading_rows 1 \
'project_id:dataset_id.foobar$20200610' ./foobar1.csv ./foobar.schema1.json
중간부터 컬럼이 증가
중간에서 읽을 CSV 열이 증가했다고 가정합니다.
이 경우,
[
{
"mode": "NULLABLE",
"name": "a",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "b",
"type": "INTEGER"
}
]
"a","b"
"abc",1
"xyz",9
bq load \
--source_format=CSV --skip_leading_rows 1 \
'project_id:dataset_id.foobar$20200610' ./foobar1.csv ./foobar.schema1.json
중간에서 읽을 CSV 열이 증가했다고 가정합니다.
이 경우,
두 가지가 필요하지만 schema_update_option에
ALLOW_FIELD_ADDITION
를 지정하면 bq update(table schemaのupdate)
가 필요하지 않습니다.Day 2
테이블 스키마
foobar.schema2.json
[
{
"mode": "NULLABLE",
"name": "a",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "b",
"type": "INTEGER"
},
{
"mode": "NULLABLE",
"name": "c",
"type": "STRING"
}
]
투입 데이터
foobar2.csv
"a","b","c"
"abc",1,"zzz"
"xyz",9,"zzz"
Load 명령
bq load \
--source_format=CSV --skip_leading_rows 1 \
--schema_update_option ALLOW_FIELD_ADDITION \
'project_id:dataset_id.foobar$20200611' ./foobar2.csv ./foobar.schema2.json
로드 결과
예상대로 Day2에서 늘어난 컬럼에 과거 분에는 null이 들어 있습니다.
재실행시의 주의점
rerun 하는 경우, load 하기 전에 파티션을 삭제하지 않으면 이중으로 데이터가 들어 버리므로 주의
재실행 전에 파티션 지우기
bq rm --force 'project_id:dataset_id.foobar$20200611'
그리고 이것을 썼을 때 --replace
옵션으로 비슷한 것을 할 수 있다는 것을 알았습니다. Day2의 쿼리에 --replace
를 붙이는 것만으로 좋을 것 같습니다.
bq load \
--replace \
--source_format=CSV --skip_leading_rows 1 \
--schema_update_option ALLOW_FIELD_ADDITION \
'project_id:dataset_id.foobar$20200611' ./foobar2.csv ./foobar.schema2.json
요약
그렇기 때문에, 실제의 운용상은, 일차로 이하와 같은 bq 커멘드를 돌리면 하고 싶을 수가 있을 것 같습니다.
export LOAD_FILE="./foobar2.csv"
export TARGET_TABLE="'project_id:dataset_id.foobar$20200611'"
export SCHEMA="./foobar.schema2.json"
bq load \
--replace \
--source_format=CSV --skip_leading_rows 1 \
--schema_update_option ALLOW_FIELD_ADDITION \
${TARGET_TABLE} ${LOAD_FILE} ${SCHEMA}
Reference
이 문제에 관하여(bq 명령으로 schema_update_option을 지정하면 열 추가 작업이 쉽습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shase428q/items/f08aa35199b8d872b3c8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
bq rm --force 'project_id:dataset_id.foobar$20200611'
bq load \
--replace \
--source_format=CSV --skip_leading_rows 1 \
--schema_update_option ALLOW_FIELD_ADDITION \
'project_id:dataset_id.foobar$20200611' ./foobar2.csv ./foobar.schema2.json
그렇기 때문에, 실제의 운용상은, 일차로 이하와 같은 bq 커멘드를 돌리면 하고 싶을 수가 있을 것 같습니다.
export LOAD_FILE="./foobar2.csv"
export TARGET_TABLE="'project_id:dataset_id.foobar$20200611'"
export SCHEMA="./foobar.schema2.json"
bq load \
--replace \
--source_format=CSV --skip_leading_rows 1 \
--schema_update_option ALLOW_FIELD_ADDITION \
${TARGET_TABLE} ${LOAD_FILE} ${SCHEMA}
Reference
이 문제에 관하여(bq 명령으로 schema_update_option을 지정하면 열 추가 작업이 쉽습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shase428q/items/f08aa35199b8d872b3c8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)