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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Embulk

Embulkは、CSVデータやアクセスログなどの構造化データを高い信頼性で転送することができる、プラグインベースのバルクデータローダーです。

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

6回答

3801閲覧

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

raccoondog

総合スコア79

Embulk

Embulkは、CSVデータやアクセスログなどの構造化データを高い信頼性で転送することができる、プラグインベースのバルクデータローダーです。

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/02/20 03:29

編集2019/02/21 06:51

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/02/20 04:15 編集

number()の精度は?
raccoondog

2019/02/20 04:35

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

回答6

0

filtersをコメントにして

out: type: stdout

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

2019-02-25 17:16 追加

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

yaml

1in: 2 type: oracle 3 path_prefix: null 4 driver_path: xxxx\product\12.2.0\dbhome_1\sqldeveloper\jdbc\lib\ojdbc7.jar 5 host: A0430-02396 6 user: system 7 password: xxx 8 database: ORCL 9 table: T_RS_TRAN_VIEW # <<-- HERE 10 incremental_columns: [ORDER_NO] 11 incremental: true

2019-03-04 11:11 追加

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

yaml

1in: 2 type: oracle 3 driver_path: xxxx\product\12.2.0\dbhome_1\sqldeveloper\jdbc\lib\ojdbc7.jar 4 host: A0430-02396 5 user: system 6 password: xxx 7 database: ORCL 8 table: T_RS_TRAN 9 incremental_columns: [ORDER_NO] 10 incremental: true 11 column_options: 12 ORDER_NO: { value_type: long } # あるいは { value_type: string }

投稿2019/02/21 02:09

編集2019/03/04 02:16
hiroysato

総合スコア415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccoondog

2019/02/21 02:21

上記手順で実行しますと org.embulk.config.configexception: attribute type is required but not set が出力されてしまいます。
hiroysato

2019/02/21 02:30

設定間違えてませんか? `filters`全体をコメントにしないとエラーになりますよ。inputだけにして入力がちゃんと取得できているかを確認するのが良いと思います。
raccoondog

2019/02/21 02:41

すみません、out句の定義が誤っておりました。 定義を修正し、正常に実行されました。 結果は、やはり最終レコードのカラム値が ZZZZ2W98FZCM となり 0レコードになりました。
hiroysato

2019/02/21 03:43

標準出力にデータは出てますか?、-cを外したら全件でるはずですが出力されますか? その辺りを確認するのが良いように思います。
raccoondog

2019/02/21 04:23

-cを外しますと全件標準出力にデータが表示されました。
hiroysato

2019/02/21 04:35

それでは、-c xxxのxxファイルを消してembulk -c xxx config.ymlしたら in: last_record: [ZZZZ2W98FZCM] out: {} となりますか?、その後「ZZZZ2W98FZCN」のようなデータを作ったら SELECT * FROM "T_RS_TRAN" WHERE (("HINBAN" > "ZZZZ2W98FZCM")) ORDER BY "HINBAN" は1件だけ表示されるんでしょうか? その状態でembulkを実行するとどうなりますか? というのを一つ一つ確かめるのが良いように思います。
raccoondog

2019/02/21 05:28

>それでは、-c xxxのxxファイルを消してembulk -c xxx config.ymlしたら >in: >last_record: [ZZZZ2W98FZCM] >out: {} >となりますか?、 上記テスト結果、last_record: [ZZZZ2W98FZCM]となりました。 >その後「ZZZZ2W98FZCN」のようなデータを作ったら >SELECT * FROM "T_RS_TRAN" WHERE (("HINBAN" > "ZZZZ2W98FZCM")) ORDER BY "HINBAN"は1件だけ表示されるんでしょうか? データ作成後の検索すると全レコードが表示されます >その状態でembulkを実行するとどうなりますか? 0レコードのインサート処理になってしまいます。
raccoondog

2019/02/21 05:32

テスト用の数カラム程度のテーブルでは、DT(日付カラム)で成功し、 仮想本番用の80カラム程度のテーブルでは、どのカラムを選択しても失敗いたします。 これはembulkとして対応できるカラム数を超えているのでしょうか?
hiroysato

2019/02/21 05:36

変ですね。Oracleはよくわからないんですが、sqlで文字列絞り込みできないんでしょうか? SELECT * FROM "T_RS_TRAN" WHERE (("HINBAN" > "ZZZZ2W98FZCM")) ORDER BY "HINBAN" で全件でるって変じゃないですか? 自分がやるとしたらあとはint,dateのカラムとかで試します。
hiroysato

2019/02/21 06:22

まず少ないカラムで文字列のlast_recordが期待通り動くことを確認してみてはどうでしょうか? ログやテーブル定義がないので、成功とか失敗とか言われてもよくわからないです。 多分カラムの数は関係ないと思いますが私は80カラムはやったことがないです。 SELECT * FROM "T_RS_TRAN" WHERE (("HINBAN" > "ZZZZ2W98FZCM")) ORDER BY "HINBAN" で全件出ているのはOracleの設定の問題か何かのような気がします。
raccoondog

2019/02/21 06:53

ご回答有難うございます。 カラム定義を見直していまして、一旦、seed.ymlファイルからpreviewしてみますと 質問内容の「■embulkによるseed.ymlファイルのpreview結果」にも記載していますとおり embulkが勝手に?? number型のカラムを、double型に変換してしまいます。
raccoondog

2019/02/21 06:57

この勝手に変換させないようにして、本来あるべきNumber型 or String型で取りこめられれば、問題なく増分用のカラム値として使えるのか? と考えております。 embulkは初めて利用しているのですが、他のシステムでも同じようにembulkを使用したい場合 増分用のカラム値を指定するのに、一意性を担保するにはシーケンシャルな値が含まれているカラム値を指定するのでは?と思っておりまして、number型のカラムが選ばれる機会が多いのではなかろうか。。。 と不思議に感じております。
hiroysato

2019/02/21 09:42

Embulkは、boolean, long, timestamp, double, string, jsonしか型がありません。 numberは不動小数点を使うとおもうのでdoubleに変換されます。仕様です。
raccoondog

2019/02/21 23:43 編集

ご回答有難うございます。 >numberは不動小数点を使うとおもうのでdoubleに変換されます。仕様です。 増分バルクインサートをするのに、number型のカラムを指定するのは不可である仕様、理解しました。 incrementalオプション(増分バルクインサート)をやめて、 他のオプションを使って、増分バルクインサートのように実装したいです。 queryオプションを使って、特定のカラムで前回インサート処理の最終行以降のレコードを対象とするように実装(SQLで)すれば可能でしょうか?
raccoondog

2019/02/22 01:15

イメージとしましては embulkのqueryオプションで select *** from T_RS_TRAN where **** で前回データ取得行を最終レコードとみなして、最終レコードからデータ取得
raccoondog

2019/02/22 02:45

double型のカラムをincremental columnでもサポートするように、プルリクエスト? する事は可能でしょうか? プルリクエスト?したことがないのですが、開発元?への依頼ができるのか知りたいです。
hiroysato

2019/02/22 04:57

queryはincrementalには対応していないので、use_raw_query_with_incrementalを使います。 その場合はhttps://teratail.com/questions/163111 こちらと一緒です。 プルリクエストはご自身でプログラムを改修して取り込みを依頼することです。 要望等はIssueの方に書くのが一般的です。 こちらにお願いします。 https://github.com/embulk/embulk-input-jdbc
raccoondog

2019/02/22 05:26

ご回答有難うございます。 >https://teratail.com/questions/163111 >余談ですがuse_raw_query_with_incrementalは、last_recordは自分で更新する必要があります。 >embulkはこの値を書き換えません。 queryで、Order_No(Number型)をキーにして検索 last_recordは、embulkのout句でコマンドオプションによるファイルへ最終レコード書き込み処理をする。などは可能でしょうか use_raw_query_with_incrementalを使った時に、double型のカラムが使えるか検証が必要ですが。。
raccoondog

2019/02/22 05:34

もし、ご存じでしたら教えて頂きたいのですが embulkのプログラムで、incremental_columnを使用する場合に、double型のカラム値もサポートするようにコードを書換えたい場合、どの箇所を変更すればよいでしょうか。 そう簡単には書換えられない。となるのでしょうか。。
hiroysato

2019/02/22 05:50

> queryで、Order_No(Number型)をキーにして検索 > last_recordは、embulkのout句でコマンドオプションによるファイルへ最終レコード書き込み処理をする。などは可能でしょうか ご質問の意図がよくわからないのですが、先ほども申し上げた通りqueryはincremental未対応です。 > embulkのプログラムで、incremental_columnを使用する場合に、double型のカラム値もサポートするようにコードを書換えたい場合、どの箇所を変更すればよいでしょうか。 簡単かどうかは人によって違うと思いますので、ソースをご覧ください。
hiroysato

2019/02/22 05:51

ちなみにstringやintでも動かないとおっしゃっていましたが原因はわかりましたでしょうか?
raccoondog

2019/02/22 05:58

データの中身を確認すると値がランダムでして、恐らくembulkがデータ検索した時に前回最終レコードの値よりも小さいから、結果として0レコードになっているものだと推測しております。 DBAに確認したところ、80カラムの中でシーケンシャルな値をもっているカラムはorder_noのみ。との事でした。 どうにかして、order_noを検索キーに増分バルクインサートを実装させたいです。 >先ほども申し上げた通りqueryはincremental未対応です。 ただ、現状queryオプションは増分バルクインサート未対応なので、embulkのソースコードを改修しない限り実装不可能?
raccoondog

2019/02/22 06:02

システムの仕組み上、日付カラム(timestamp)も、OracleのDBに取り込まれる際に、時系列順にインサートされるとは限らないそうです。。 ただし、Order_Noだけはシーケンシャルに取り込まれているそうです。
hiroysato

2019/02/22 06:14

queryになんでこだわるかわからないのですが、今まで出たであろう方法として次のいずれかが利用できるように思います。 (1) Viewを使う (2) use_raw_query_with_incremental を使う (3) Embulkのソースを直す > データの中身を確認すると値がランダムでして、恐らくembulkがデータ検索した時に前回最終レコードの値よりも小さいから、結果として0レコードになっているものだと推測しております この回答の上の方にある、これはお試しになってないんでしょうか?、「ZZZZ2W98FZCM」よりも後の文字として「ZZZZ2W98FZCN」をご紹介したつもりだったのです sqlは""で囲っていたので、間違えているかもしれませんが、Embulkの件数は0件にはならないように思います。 >> その後「ZZZZ2W98FZCN」のようなデータを作ったら >> SELECT * FROM "T_RS_TRAN" WHERE (("HINBAN" > "ZZZZ2W98FZCM")) ORDER BY "HINBAN"は1件だけ表示されるんでしょうか? > データ作成後の検索すると全レコードが表示されます
raccoondog

2019/02/22 06:31

ご回答有難うございます。 現状、可能な選択肢としましては >(2) use_raw_query_with_incremental を使う となりそうです。 ただ、前回ご回答頂いた内容から、use_raw_query_with_incremental オプションを使った時の問題点として、last_recordを手動で変更しないといけない。これを自動化させるのにどうすればよいのか? 前回は断念致しました。 他の方法や、残っている検証について、引き続き検証させて頂きます。
raccoondog

2019/02/22 06:59

embulkのソースコード改修は、embulk-0.9.15.batファイルを直接書換えればよいのでしょうか?
raccoondog

2019/02/22 08:02 編集

>> その後「ZZZZ2W98FZCN」のようなデータを作ったら >> SELECT * FROM "T_RS_TRAN" WHERE (("HINBAN" > "ZZZZ2W98FZCM")) ORDER BY "HINBAN"は1件だけ表示されるんでしょうか? > データ作成後の検索すると全レコードが表示されます 上記につきまして、検証結果 Oracle上で、1レコードのみ表示されました。 embulkの結果ファイルには、last_record箇所に、追加した値が出力されていました。
raccoondog

2019/02/25 05:52

現在、八方塞がりの状況となります。
raccoondog

2019/02/25 07:54

embulkのオプションを駆使して、対応したいです。 query: (Viewを使ってOrder_Noをデータ型変換(numberからCHAR)) incremental: true incremental_column: [order_No] use_raw_query_with_incremental: true last_record: [???] この方法で実装した場合なんですが、 last_recordの値を自動的に更新するようにしたいです。 何か方法はありますでしょうか?
hiroysato

2019/02/25 08:04

何回も何回も何回も「queryはincrementalに未対応」とお伝えしているんですが、、 viewを使うなら普通にincremental_columnにorder_noが使えると思いますよ。
raccoondog

2019/02/25 08:14

すみません、仕様理解について抜けておりました ➀Oracle側でviewを使って、データ変換 ➁embulk側で増分オプションを使って、増分バルクインサート ➀⇒➁の流れで対応出来るように実装方法を考えたいと思います。
raccoondog

2019/02/25 08:50

有難うございます。 viewを作成して ⇒embulkに取り込んで ⇒最終レコードのOrder_Noのカラム値を参照 させればできそうです。 大変助かります。
guest

0

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

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

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

投稿2019/02/20 08:06

hiroysato

総合スコア415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccoondog

2019/02/20 23:58

ご回答有難うございます。 別のカラムでテストを実施しました。 結果として、正常にembulkは動作したのですが、最終レコードのカラム値を参照し増分バルクインサートを実行するも、0レコードとなってしまいました。 定義方法に不備などありますでしょうか
raccoondog

2019/02/20 23:58

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

0

過去に質問した内容がなぜ「原因が不明」なんでしょうか?
過去のメールをよく確認してみてはいかがでしょうか?
リジューム機能を使ったバルクインサート失敗

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

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

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

yaml

1 type: oracle 2 # ... 略 3 columns: 4 - {name: ID, type: string}

投稿2019/02/20 04:16

hiroysato

総合スコア415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccoondog

2019/02/20 04:30

すみません。 原因不明ではなく、カラム構成を変えられない。が正しいです。 投稿内容に誤りがありました。
guest

0

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

SQL

1SQL> desc T_RS_TRAN 2 名前 NULL? 型 3 ----------------------------------------- -------- ---------------------------- 4 ORDER_NO NUMBER(15) 5 6Embulk 7 columns: 8 - {name: ORDER_NO, type: string}

投稿2019/02/20 03:46

編集2019/02/20 04:24
Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccoondog

2019/02/20 04:35

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

2019/02/20 06:49

本番DBに対して作業を行うのが難しく、可能であればembulkの定義で対応したい状況となります。
Orlofsky

2019/02/20 07:10

VIEWはMATERIALIZED VIEWと違ってディスク容量が増えるわけではありません。CREATE VIEW文を実行させてもらえないならDBAに抗議します。それがダメなら上長に訴えては?
raccoondog

2019/02/20 07:33

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

2019/02/25 06:59 編集

>TO_CHAR(ORDER_NO, 'FM000000000000000') で文字型にCASTして、 >VIEWを Embulk に取り込んでは? すみません、具体的な実装方法を教えて頂きたいです。 対象のテーブルは80カラムありまして データ型を変更させたいカラムは1つになります 全体では、1億レコード程あります。 毎回、1億レコードを処理させるのは負荷が高くなる可能性がありまして 増分だけ変更させたいです
Orlofsky

2019/02/25 07:35

Embulk 側はわからないのでOrale の方だけですが、Oracle側で CREATE VIEW VIEW1 AS SELECT TO_CHAR(ORDER_NO, 'FM000000000000000') AS ORDER_NO , 他のカラムの並び FROM TABLE_NAME1 ; でビューを作ってEmbulk に取り込みます。 >増分だけ変更させたいです 前回どこまでEmbulk に取り込んだかの情報を別のテーブルを用意して保存されては? raccoondogさんの今のスキルでは実装は難しそうですから、Oracle や Embulk の熟練者を1ヶ月でも2ヶ月でも雇った方が実用に耐えられるシステムを早く安上がりに作れそうです。上長に相談されては?
raccoondog

2019/02/25 07:49

ご回答有難うございます。 とても助かります。
raccoondog

2019/02/25 08:47

以下の処理を考えております。 1.OracleでView作成 2.embulkで増分バルクインサート 3.OracleでView削除 1~3の処理を10分間隔ぐらいでクーロンで自動実行 1億レコード以上のテーブルに対して10分毎に、Viewを作成したり、削除したりを繰り返した場合 Oracleの挙動に影響を及ぼす事はありますでしょうか?(リソース枯渇など) あやふやな質問で申し訳ございません。
Orlofsky

2019/02/25 09: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などのチューニングをするなり、より高性能のハードウェアに移行することを考えます。 データの有効期間は方式設計の中で考えます。いつどこで発生して、どこで使われて、そのデータの保存期間は?
raccoondog

2019/02/25 09:44

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

0

自己解決

hiroysato様、sazi様、Orlofsky様

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

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

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

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

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

投稿2019/02/25 09:52

raccoondog

総合スコア79

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2019/02/21 00:56

編集2019/02/25 08:18
hiroysato

総合スコア415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccoondog

2019/02/21 01:07

ご回答ありがとうございます。 上記SQLを実行しますと大量に結果が出力される状況となります。
raccoondog

2019/02/21 01:36

日付カラムを使用しても同じ結果となってしまいました。 ACT_CREATION_DATE Oracleでの定義:DATE型 Embulkでの定義:String型(※Fileter句で、%y%m%d %H:%M:%S) embulkの定義で(in句、filters句)指定すべきパラメータが不足していますでしょうか。 ※指定しているパラメータ in句 type path_prefix driver_path host user password database table incremental incremental_columns columns filters句 type default_to_timezone default_from_timestamp_format columns
sazi

2019/02/21 08:06

HINBANってカラム名なんですよね?それでZZZZ2W98FZCMは値ですよね? WHERE (HINBAN > 'ZZZZ2W98FZCM') じゃないの?
sazi

2019/02/21 08:09

> hiroysato さん 時系列的に追いやすいので、できれば別回答ではなく、回答の編集で対応していただければと思います。
hiroysato

2019/02/21 09:38

> saziさん 私も時系列で並んだ方が見やすいです。別回答にすればあとに回答したものが一番したにくると思っていたところ、途中に入ってしまうものがあるようです。 回答のコメントはMarkdownが別回答にしていたのですが、いままで「回答」した内容に「編集」するんですね。 ログに出ているものをそのまま貼り付けてしまいましたが、おっしゃるように SELECT * FROM T_RS_TRAN WHERE ((HINBAN > 'ZZZZ2W98FZCM')) ORDER BY HINBAN になると思います。
sazi

2019/02/21 09:43

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

2019/02/21 09:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問