質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.21%

bigqueryテーブルのデータ型変換につきまして

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 430

raccoondog

score 17

Bigqueryのテーブルにデータ型がFLOATの列があります。
FLOATの列を、NUMERICの列にしたいです。

特定列のみを指定してCAST関数で変換可能でしょうか?

また、Oracle⇒embulk⇒bigquery でデータ型が自動的に変換されるのは仕様でしょうか?
embulkで事前にデータ型を指定して(NUMMERICになるように)bigqueryへインサートさせれば
想定通りのテーブルが構成されますでしょうか?

例、列名:ORDER_NO

Oracle:NUMBER(15)
↓自動解析
embulk:double
↓自動解析
bigquery:float

※OracleのVIEWは使用せず、対応したいです。

※2019/4/16

環境:oracle 12c、embulk 0.9.15

※Oracle定義

SQL> desc T_RS_TRAN
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 ORDER_NO                                  NOT NULL NUMBER(15)
 RS_TYPE                                   NOT NULL VARCHAR2(1)
 FACTORY_CODE                              NOT NULL VARCHAR2(4)
 ORG_CODE                                  NOT NULL VARCHAR2(3)
 TRAN_DATE                                 NOT NULL DATE
 HINBAN                                    NOT NULL VARCHAR2(40)
 QTY                                       NOT NULL NUMBER(11,2)
 SLIP_NO                                   NOT NULL VARCHAR2(10)
 ITEM_NO                                   NOT NULL VARCHAR2(2)
 DIVISION_NO                                        NUMBER(1)
 ●●
 ●●
 ●●
 INV_INFO_UPDATE_FLAG                               VARCHAR2(1)

※実行ログ
2019-04-16 16:47:24.274 +0900 [ERROR] (0001:transaction): embulk-output-bigquery: failed during waiting a Copy job, get_job(yzk-gcp-project, embulk_copy_job_ec19947a-757f-4119-9620-7ccdeb023777), errors:[{:reason=>"invalid", :message=>"Provided Schema does not match Table yzk-gcp-project:srdcs_data.T_RS_TRAN_20190416. Field ORDER_NO has changed type from NUMERIC to STRING"}]
2019-04-16 16:47:24.276 +0900 [INFO] (0001:transaction): embulk-output-bigquery: Delete table... yzk-gcp-project:srdcs_data.LOAD_TEMP_eb1cab64_4892_425b_bf29_d279cc655440_T_RS_TRAN_20190416
2019-04-16 16:47:24.590 +0900 [INFO] (0001:transaction): embulk-output-bigquery: delete /var/tmp/embulk_output_bigquery_20190416-15487-1vrnvze.15487.2004.csv
2019-04-16 16:47:24.590 +0900 [INFO] (0001:transaction): embulk-output-bigquery: delete /var/tmp/embulk_output_bigquery_20190416-15487-1vrnvze.15487.2006.csv
2019-04-16 16:47:24.591 +0900 [INFO] (0001:transaction): embulk-output-bigquery: delete /var/tmp/embulk_output_bigquery_20190416-15487-1vrnvze.15487.2008.csv
2019-04-16 16:47:24.591 +0900 [INFO] (0001:transaction): embulk-output-bigquery: delete /var/tmp/embulk_output_bigquery_20190416-15487-1vrnvze.15487.2010.csv
2019-04-16 16:47:24.591 +0900 [INFO] (0001:transaction): embulk-output-bigquery: delete /var/tmp/embulk_output_bigquery_20190416-15487-1vrnvze.15487.2012.csv
org.embulk.exec.PartialExecutionException: org.jruby.exceptions.RaiseException: (Error) failed during waiting a Copy job, get_job(yzk-gcp-project, embulk_copy_job_ec19947a-757f-4119-9620-7ccdeb023777), errors:[{:reason=>"invalid", :message=>"Provided Schema does not match Table yzk-gcp-project:srdcs_data.T_RS_TRAN_20190416. Field ORDER_NO has changed type from NUMERIC to STRING"}]
        at org.embulk.exec.BulkLoader$LoaderState.buildPartialExecuteException(BulkLoader.java:340)
        at org.embulk.exec.BulkLoader.doRun(BulkLoader.java:566)
        at org.embulk.exec.BulkLoader.access$000(BulkLoader.java:35)
        at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:353)
        at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:350)
        at org.embulk.spi.Exec.doWith(Exec.java:22)
        at org.embulk.exec.BulkLoader.run(BulkLoader.java:350)
        at org.embulk.EmbulkEmbed.run(EmbulkEmbed.java:178)
        at org.embulk.EmbulkRunner.runInternal(EmbulkRunner.java:292)
        at org.embulk.EmbulkRunner.run(EmbulkRunner.java:156)
        at org.embulk.cli.EmbulkRun.runSubcommand(EmbulkRun.java:436)
        at org.embulk.cli.EmbulkRun.run(EmbulkRun.java:91)
        at org.embulk.cli.Main.main(Main.java:64)
Caused by: org.jruby.exceptions.RaiseException: (Error) failed during waiting a Copy job, get_job(yzk-gcp-project, embulk_copy_job_ec19947a-757f-4119-9620-7ccdeb023777), errors:[{:reason=>"invalid", :message=>"Provided Schema does not match Table yzk-gcp-project:srdcs_data.T_RS_TRAN_20190416. Field ORDER_NO has changed type from NUMERIC to STRING"}]
        at RUBY.wait_load(/export/home/srdcs/.embulk/lib/gems/gems/embulk-output-bigquery-0.4.9/lib/embulk/output/bigquery/bigquery_client.rb:346)
        at RUBY.block in copy(/export/home/srdcs/.embulk/lib/gems/gems/embulk-output-bigquery-0.4.9/lib/embulk/output/bigquery/bigquery_client.rb:289)
        at RUBY.with_job_retry(/export/home/srdcs/.embulk/lib/gems/gems/embulk-output-bigquery-0.4.9/lib/embulk/output/bigquery/bigquery_client.rb:58)
        at RUBY.copy(/export/home/srdcs/.embulk/lib/gems/gems/embulk-output-bigquery-0.4.9/lib/embulk/output/bigquery/bigquery_client.rb:249)
        at RUBY.transaction(/export/home/srdcs/.embulk/lib/gems/gems/embulk-output-bigquery-0.4.9/lib/embulk/output/bigquery.rb:407)
        at RUBY.transaction(uri:classloader:/gems/embulk-0.9.15-java/lib/embulk/output_plugin.rb:64)

Error: org.jruby.exceptions.RaiseException: (Error) failed during waiting a Copy job, get_job(yzk-gcp-project, embulk_copy_job_ec19947a-757f-4119-9620-7ccdeb023777), errors:[{:reason=>"invalid", :message=>"Provided Schema does not match Table yzk-gcp-project:srdcs_data.T_RS_TRAN_20190416. Field ORDER_NO has changed type from NUMERIC to STRING"}]


●embulk定義
in:
  type: oracle
  path_prefix: null
  driver_path: /opt/oracle/product/12.1.0/db/jdbc/lib/ojdbc7.jar
  host: srdcs04
  user: srdcs
  password: srdcs
  database: srdcsc
  column_options:
     ORDER_NO: { value_type: string }
  query: |
     select
        trs.ORDER_NO,
        trs.RS_TYPE,
        trs.FACTORY_CODE,
        trs.ORG_CODE,
        trs.TRAN_DATE,
        trs.HINBAN,
        trs.QTY,
        trs.SLIP_NO,
        trs.ITEM_NO,
        trs.DIVISION_NO,
        trs.FROM_FACTORY_CODE,
        trs.FROM_ORG_CODE,
        trs.FROM_SUBINV_CODE,
        trs.FROM_VALUE_CODE,
        trs.FROM_OPERATOR_NAME,
        trs.TO_FACTORY_CODE,
        trs.TO_ORG_CODE,
        trs.TO_SUBINV_CODE,
        trs.TO_VALUE_CODE,
        trs.TO_OPERATOR_NAME,
        trs.SUB_SYSTEM_TYPE1,
        trs.CANCEL_FLAG,
        trs.ACT_CREATION_DATE,
        trs.WH_ACT_CREATION_DATE,
        trs.JOB_CODE,
        trs.UNIT_PRICE,
        trs.ERROR_STATUS,
        trs.DESCRIPTION,
        trs.LOCATION,
        trs.REVISION_NO,
        trs.OPE_CODE,
        trs.BOX_KIND,
        trs.DEMAND_NO,
        trs.SUB_NO,
        trs.TRAFFIC_NO,
        trs.IF_FLAG,
        trs.SELL_BUY_DATA_FLAG,
        trs.SOURCE_ORDER_NO,
        trs.FT_DEFINE_ID,
        trs.FROM_SELL_BUY_ID,
        trs.TO_SELL_BUY_ID,
        trs.CREATION_DATE,
        trs.CREATED_BY,
        trs.LAST_UPDATE_DATE,
        trs.LAST_UPDATED_BY,
        trs.UPDATE_REQUEST_ID,
        trs.TIME_STAMP,
        trs.INV_UPDATE_FLAG,
        trs.ISSUE_SEQ,
        trs.SOUMEI_ID,
        trs.GCPCS_IF_FLAG,
        trs.GCPCS_IF_CREATION_DATE,
        trs.RECIEPT_CODE,
        trs.DELIV_BIN_NO,
        trs.DELIV_NO,
        trs.RECV_BIN_NO,
        trs.SUB_SYSTEM_TYPE2,
        trs.SHIP_DATE,
        trs.C_NO,
        trs.T_NO,
        trs.RECV_OFFICE_CODE,
        trs.SR_IF_FLAG,
        trs.SR_IF_CREATION_DATE,
        trs.PS_IF_FLAG,
        trs.PS_IF_CREATION_DATE,
        trs.CUSTOMER_CODE,
        trs.KS_type,
        trs.SUPPLY_SECTION,
        trs.MANAGE_NO,
        trs.SEND_OFFICE_CODE,
        trs.SOUMEI_SLIP_NO,
        trs.SOUMEI_ITEM_NO,
        trs.PS_YAZAKI_HINBAN,
        trs.INVOICE_CASE_INFO_NO,
        trs.GYK_SITE_CODE,
        trs.CASE_NO,
        trs.CASE_SUB_NO,
        trs.FROM_LOCATION,
        trs.TO_LOCATION,
        trs.GYK_TRAN_type,
        trs.INV_INFO_UPDATE_FLAG,
        (select code_description from m_code where code_type = 'rs_type' and code  = trs.rs_type) rs_name,
        (select org_name from m_org where org_code = trs.org_code ) org_name,
        (select factory_name from m_factory where factory_code = trs.from_factory_code ) from_factory_name,
        (select org_name from m_org where org_code = trs.from_org_code ) from_org_name,
        (select subinv_name from m_subinv where org_code = trs.from_org_code and subinv_code = trs.from_subinv_code) from_subinv_name,
        (select factory_name from m_factory where factory_code = trs.to_factory_code ) to_factory_name,
        (select org_name from m_org where org_code = trs.to_org_code ) to_org_name,
        (select subinv_name from m_subinv where org_code = trs.to_org_code and subinv_code = trs.to_subinv_code) to_subinv_name,
        (select ope_code_name from m_ope_code where factory_code = trs.factory_code and ope_code = trs.ope_code) ope_code_name,
        (select sub_system_name1 from m_sub_system_type1 where sub_system_type1 = trs.sub_system_type1) sub_system_name1,
        (select code_description  from m_code where code_type= 'cancel_flag' and code= trs.cancel_flag) cancel_name,
        (select sub_system_name2 from m_sub_system_type2 where sub_system_type1 = trs.sub_system_type1 and sub_system_type2 = trs.sub_system_type2) sub_system_name2
     from
        T_RS_TRAN trs
     where
        IF_FLAG = '1' and TO_DATE(TRAN_DATE) >= TO_DATE('20190226','yyyyMMdd') and TO_DATE(TRAN_DATE) <= TO_DATE('20190227','yyyyMMdd')

out: {
type: bigquery, 
auth_method: json_key, 
json_keyfile: '/home1/bigquery/conf/My First Project-6041ffecfba7.json', 
project: fluid-emissary-216806, 
dataset: embulk_test, 
auto_create_table: true, 
table: T_RS_TRAN, 
open_read_timeout_sec: 360000, 
send_timeout_sec: 360000, 
read_timeout_sec: 360000}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

https://teratail.com/questions/181476#reply-270195
何回も何回も何回も何回も言っていますがEmbulkのバージョン情報とかログ情報、OSの情報もつけていただけますか?

Bigqueryは使っていないので詳しくわかりませんが、schema_fileとかtemplate_tableではダメなんでしょうか?
https://github.com/embulk/embulk-output-bigquery#dynamic-table-creating

schema_fileのサンプルはこちらにあるようです。
https://github.com/embulk/embulk-output-bigquery/blob/master/example/schema.json

2019-4-16 16:55 追加

Provided Schema does not match Table yzk-gcp-project:srdcs_data.T_RS_TRAN_20190416. Field ORDER_NO has changed type from NUMERIC to STRING
とあるように既存のテーブルと型が一致していないのではないでしょうか?

schema_fileとかtemplate_tableは指定されているのでしょうか?
https://github.com/embulk/embulk-output-bigquery#dynamic-table-creating

また設定ファイルをご提供いただけないんですね。。

ターゲットのテーブルを決して作り直すか、型を変える等が必要なのではないでしょうか?

NUMBERdouble※embulkにより自動変換⇒floatfloat【●】
NUMBERdouble※embulkにより自動変換⇒float⇒NUMERIC【×】

これはembulkのところは、全く一緒に見えますが、bigqueryのところが何かちがうのでしょうか?

2019-4-16 19:15 追加

こちらはご覧になりましたか?

schema_fileはBigQueryのテーブルのスキーマ定義のファイルを指定しています。これはauto_create_tableを使用する時に必要です。schema_file以外の指定の方法としてtemplate_tableやcolumn_optionsを使う方法があります。詳しくはembulk-output-bigqueryのREADME.mdを見てみてください。

out:
  type: bigquery
  auth_method: json_key
  json_keyfile: '{{ env.bq_credential }}'
  project: {{ env.bq_project }}
  dataset: {{ env.bq_dataset }}
  location: asia-northeast1
  table: {{ env.bq_table }}
  schema_file: {{ env.bq_table }}.json
  default_timezone: Asia/Tokyo
  auto_create_table: true
  path_prefix: {{ env.bq_table }}
  compression: GZIP
  time_partitioning:
    type: DAY
    field: update_time

2019-4-16 19:58 追加

他の設定を真似したらいかがでしょうか?、YAMLの書き方が間違えています。YAMLの書き方を調べて習得してください。

Column Options

out:
  type: bigquery
  auto_create_table: true
  column_options:
    - {name: date, type: STRING, timestamp_format: %Y-%m-%d, timezone: "Asia/Tokyo"}
    - name: json_column
      type: RECORD
      fields:
        - {name: key1, type: STRING}
        - {name: key2, type: STRING}

2019-4-16 20:52 追加

Column Options

 Embulk type   BigQuery type                                        default   
 boolean:      BOOLEAN, STRING                                      BOOLEAN   
 long:         BOOLEAN, INTEGER, FLOAT, STRING, TIMESTAMP           INTEGER   
 double:       INTEGER, FLOAT, STRING, TIMESTAMP                    FLOAT     
 string:       BOOLEAN, INTEGER, FLOAT, STRING, TIMESTAMP, RECORD   STRING    
 timestamp:    INTEGER, FLOAT, STRING, TIMESTAMP                    TIMESTAMP 
 json:         STRING, RECORD                                       STRING    

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/16 20:43 編集

    ご指摘ありがとうございます。
    bigquery側にテーブルを作成していない状況にしても

    embulkは、NUMERICがサポート外

    bigquery側に、NUMEIRICのデータを作成させることは出来ない。のではないか。。。

    という認識となります。

    キャンセル

  • 2019/04/16 20:55

    あぁBigQueryにNUMERICって型があるんですね。ベータっぽいですね。
    https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric-type

    ドキュメントのとおりだとサポートされていないのかもしれませんね。

    キャンセル

  • 2019/04/16 22:57 編集

    embulk-output-bigquery-0.4.9では、
    numericがサポートされておらず
    新しいバージョンで対応されるのを待つしかない。
    若しくは、bigquery側で対応する


    という事ですね

    ご回答有難うございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる