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

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

ただいまの
回答率

90.23%

embulkのincremental_columns定義とOracleの定義不一致によるエラー

解決済

回答 6

投稿 編集

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

raccoondog

score 17

Embulkで増分バルクインサートする際に、incremental_columnsオプションを使っています。
連番でデータが蓄積されるカラム値をincremental_columnsに指定させたいので、特定のカラムを指定するとエラーが発生。

原因は、double型はサポートしていない。との事
しかしながら、Oracleで定義しているカラムのデータ型は、NUMBER型

根本原因が不明の状況となります。
定義や環境は以下となります。

環境:
Microsoft Windows 7 Enterprise  6.1.7601 Service Pack 1 ビルド 7601
Java 1.8.0_192
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
embulk (0.9.15 java)
embulk-input-oracle (0.9.3)
embulk-output-bigquery (0.4.9)
embulk-filter-timestamp_format (0.3.3)



■Oracle定義

SQL> desc T_RS_TRAN
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 ORDER_NO                                           NUMBER(15)


■Embulk定義
in:
  type: oracle
  path_prefix: null
  driver_path: xxxx\product\12.2.0\dbhome_1\sqldeveloper\jdbc\lib\ojdbc7.jar
  host: A0430-02396
  user: system
  password: xxx
  database: ORCL
  table: T_RS_TRAN
  incremental_columns: [ORDER_NO]
  incremental: true
  columns:
    - {name: ORDER_NO, type: string}

■実行時のエラー

org.embulk.exec.PartialExecutionException: org.embulk.spi.DataException: Column type 'double' set at incremental_columns option is not supported
        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.embulk.spi.DataException: Column type 'double' set at incremental_columns option is not supported
        at org.embulk.input.jdbc.getter.AbstractColumnGetter.encodeToJson(org/embulk/input/jdbc/getter/AbstractColumnGetter.java:92)
        at org.embulk.input.jdbc.AbstractJdbcInputPlugin$LastRecordStore.accept(org/embulk/input/jdbc/AbstractJdbcInputPlugin.java:441)
        at org.embulk.input.jdbc.AbstractJdbcInputPlugin.run(org/embulk/input/jdbc/AbstractJdbcInputPlugin.java:490)
        at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor.runInputTask(org/embulk/exec/LocalExecutorPlugin.java:269)
        at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor.access$100(org/embulk/exec/LocalExecutorPlugin.java:194)
        at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor$1.call(org/embulk/exec/LocalExecutorPlugin.java:233)
        at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor$1.call(org/embulk/exec/LocalExecutorPlugin.java:230)
        at java.util.concurrent.FutureTask.run(java/util/concurrent/FutureTask)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java/util/concurrent/ThreadPoolExecutor)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java/util/concurrent/ThreadPoolExecutor$Worker)
        at java.lang.Thread.run(java/lang/Thread)

Error: org.embulk.spi.DataException: Column type 'double' set at incremental_columns option is not supported
■embulkによるseed.ymlファイルのpreview結果

2019-02-21 15:33:49.668 +0900: Embulk v0.9.15
2019-02-21 15:33:50.042 +0900 [WARN] (main): DEPRECATION: JRuby org.jruby.embed.ScriptingContainer is directly injected.
2019-02-21 15:33:52.433 +0900 [INFO] (main): Gem's home and path are set by default: "C:\Users\yazaki\.embulk\lib\gems"
2019-02-21 15:33:53.222 +0900 [INFO] (main): Started Embulk v0.9.15
2019-02-21 15:33:53.284 +0900 [INFO] (0001:preview): Loaded plugin embulk-input-oracle (0.9.3)
2019-02-21 15:33:53.315 +0900 [INFO] (0001:preview): Connecting to jdbc:oracle:thin:@A0430-02396:1521:ORCL options {oracle.jdbc.ReadTimeout=1800000, user=system, password=***, oracle.net.CONNECT_TIMEOUT=300000}
2019-02-21 15:33:53.690 +0900 [INFO] (0001:preview): Using JDBC Driver 12.1.0.2.0
2019-02-21 15:33:53.846 +0900 [INFO] (0001:preview): Connecting to jdbc:oracle:thin:@A0430-02396:1521:ORCL options {oracle.jdbc.ReadTimeout=1800000, user=system, password=***, oracle.net.CONNECT_TIMEOUT=300000}
2019-02-21 15:33:53.939 +0900 [INFO] (0001:preview): SQL: SELECT * FROM "T_RS_TRAN" ORDER BY "ORDER_NO"
2019-02-21 15:33:53.955 +0900 [INFO] (0001:preview): > 0.02 seconds
+-----------------+----------------+---------------------+-----------------+
| ORDER_NO:double | RS_TYPE:string | FACTORY_CODE:string | ORG_CODE:string |
+-----------------+----------------+---------------------+-----------------+
|     2.1002419E7 |              1 |                8000 |             MQ9 |
|      2.100242E7 |              1 |                7500 |             TWP |
|      2.100243E7 |              1 |                7500 |             5BN |



■Oracleに取り込んだデータ

"21023317","2","8100","XD9",2018/06/26,"VHP5FUH3F78C",1,"38A8U","06",0,"ZZZ"
"21023321","2","8000","7J7",2018/07/14,"YT98FCU5ZSG5",50,"I0ZSCQX0","30",0,"


SQL> desc T_RS_TRAN
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 ORDER_NO                                           NUMBER(15)
 RS_TYPE                                            VARCHAR2(1)
 FACTORY_CODE                                       VARCHAR2(4)
 ORG_CODE                                           VARCHAR2(3)
 TRAN_DATE                                          DATE
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • sazi

    2019/02/20 13:14 編集

    number()の精度は?

    キャンセル

  • raccoondog

    2019/02/20 13:35

    ご回答有難うございます。
    定義を見直しさせて頂きます。

    キャンセル

回答 6

+1

Oracle が NUMBER : 数値で、Embulk が string : と文字列だから、CREATE VIEW で 
TO_CHAR(ORDER_NO, 'FM000000000000000') で文字型にCASTして、VIEWを Embulk に取り込んでは?

SQL> desc T_RS_TRAN
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 ORDER_NO                                           NUMBER(15)

Embulk
  columns:
    - {name: ORDER_NO, type: string}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/25 18:32

    SQLの基礎知識が足りません。VIEWはいちどCREATEすればずっと使えます。
    前回 Embulk に持っていったデータは二重に持っていかないように前回持っていた連番やDATE型やTIMESPTAMP型 のカラムが必要。 https://docs.oracle.com/cd/E96517_01/sqlrf/Data-Types.html#GUID-7690645A-0EE3-46CA-90DE-C96DF5A01F8F
    負荷なしでバルクインサートできるわけはありませんから、実際のデータに見合うデータ量を用意して負荷のテストを行います。それで実用に耐えられなければSQLなどのチューニングをするなり、より高性能のハードウェアに移行することを考えます。
    データの有効期間は方式設計の中で考えます。いつどこで発生して、どこで使われて、そのデータの保存期間は?

    キャンセル

  • 2019/02/25 18:44

    ご指摘有難うございます。
    DBAと相談する前に、基礎知識を学んで、実機で検証して、それからプロジェクト内で相談させて頂きます。

    キャンセル

  • 2019/02/25 19:05

    その前に、今抱えている作業をいつまで延ばしてもらえるかを上長に相談されては?
    勉強する時間がないようですから有償研修を受けるのが近道。費用はかかります。4月になると新人研修の一貫として受けさせる会社が多いですから混みます。
    https://www.ashisuto.co.jp/ojt/course/oracle/
    http://www.oracle.com/jp/education/promotion/course-flow-database.html

    キャンセル

+1

過去に質問した内容がなぜ「原因が不明」なんでしょうか?
過去のメールを確認してみてはいかがでしょうか?
https://teratail.com/questions/160529#reply-240850

NUMBERが使えなかったからDTを使うようにしたのではないですか?

今のカラム構成を変えられない場合はOrlofskyさんの方法が良いように思います。

マニュアルをよくご覧ください。以下のcolumnsは何も効果がありません。

  type: oracle
  # ... 略
  columns:
  - {name: ID, type: string}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/20 13:30

    すみません。
    原因不明ではなく、カラム構成を変えられない。が正しいです。

    投稿内容に誤りがありました。

    キャンセル

+1

試しにembulk側で、ORDER_NOの定義を「long」「double」「string」としましたが結果は変わらずでした。
これは、Oracle側のテーブル作成時にNUMBER型で作成したカラムは、embulkでは増分用カラム値としてはサポートしていない。という理解で宜しいでしょうか。

先ほどのコメントしたとおりcolumnsに書いてもなんの効果もありません

こちらでコメントしたとおりカラムの変換にはcolumn_optionsを使いますがこれはincremental_columnsには使えないので、カラムを変えるの良いと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/21 08:58

    ご回答有難うございます。
    別のカラムでテストを実施しました。

    結果として、正常にembulkは動作したのですが、最終レコードのカラム値を参照し増分バルクインサートを実行するも、0レコードとなってしまいました。

    定義方法に不備などありますでしょうか

    キャンセル

  • 2019/02/21 08:58

    質問内容を更新させて頂きました。

    キャンセル

+1

filtersをコメントにして

out:
  type: stdout

embulk run -c diff.yml config.ymlするとデータが出力されますか?

2019-02-25 17:16 追加

Viewを使うならこれでいいんじゃないですか?

in:
  type: oracle
  path_prefix: null
  driver_path: xxxx\product\12.2.0\dbhome_1\sqldeveloper\jdbc\lib\ojdbc7.jar
  host: A0430-02396
  user: system
  password: xxx
  database: ORCL
  table: T_RS_TRAN_VIEW # <<-- HERE
  incremental_columns: [ORDER_NO]
  incremental: true

2019-03-04 11:11 追加

すいません。ちょっと勘違いしていました。Viewを使わなくてもこうすればdoubleのカラムをincremental: trueで使えるような気がします。longに変換する場合は浮動小数点は捨てられるので小数点以下を使って順序がかわるようなケースには使えないかもしれません。
文字列の場合は1.01.01どちらが先に並ぶかの検討も必要だと思います。

in:
  type: oracle
  driver_path: xxxx\product\12.2.0\dbhome_1\sqldeveloper\jdbc\lib\ojdbc7.jar
  host: A0430-02396
  user: system
  password: xxx
  database: ORCL
  table: T_RS_TRAN
  incremental_columns: [ORDER_NO]
  incremental: true
  column_options:
    ORDER_NO: { value_type: long } # あるいは { value_type: string }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/25 17:14

    すみません、仕様理解について抜けておりました

    ➀Oracle側でviewを使って、データ変換
    ➁embulk側で増分オプションを使って、増分バルクインサート

    ➀⇒➁の流れで対応出来るように実装方法を考えたいと思います。

    キャンセル

  • 2019/02/25 17:19

    キャンセル

  • 2019/02/25 17:50

    有難うございます。

    viewを作成して
    ⇒embulkに取り込んで
    ⇒最終レコードのOrder_Noのカラム値を参照

    させればできそうです。
    大変助かります。

    キャンセル

check解決した方法

0

hiroysato様、sazi様、Orlofsky様

御三方のご尽力により、問題解決出来ました。
大変助かりました。

OracleでViewを作成、Embulkで増分バルクインサート

上記実装で検証成功致しました。

私の勉強不足により、あやふやな質問が多く、ご迷惑をお掛けし申し訳ございません。

ご協力有難うございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

結果として、正常にembulkは動作したのですが、最終レコードのカラム値を参照し増分バルクインサートを実行するも、0レコードとなってしまいました。

インサートされたHINBANがどんなのかわからないのでなんとも言えませんが、以下のクエリでZZZZ2W98FZCMなにも出力されないなら、インサートしたHINBANZZZZ2W98FZCMよりも前になるデータだと思います。
intとかdatetimeの方がわかりやすい気がします。

SELECT * FROM "T_RS_TRAN" WHERE (("HINBAN" > "ZZZZ2W98FZCM")) ORDER BY "HINBAN"

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/21 18:38

    > saziさん

    私も時系列で並んだ方が見やすいです。別回答にすればあとに回答したものが一番したにくると思っていたところ、途中に入ってしまうものがあるようです。

    回答のコメントはMarkdownが別回答にしていたのですが、いままで「回答」した内容に「編集」するんですね。

    ログに出ているものをそのまま貼り付けてしまいましたが、おっしゃるように

    SELECT * FROM T_RS_TRAN WHERE ((HINBAN > 'ZZZZ2W98FZCM')) ORDER BY HINBAN
    になると思います。

    キャンセル

  • 2019/02/21 18:43

    > hiroysato さん
    評価やベストアンサーなどで並びが変わってしまうので、回答の日付とかから追っかけるのはちょっと厳しいです。
    次回からでも気にして頂ければ。

    キャンセル

  • 2019/02/21 18:46

    > saziさん
    ありがとうございます。気をつけます。

    キャンセル

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

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