3

現在、Linux 環境でスクリプトを作成するために Scala を使用しています。Hive で ETL プロセスとして使用します。ProcessLogger クラスを使用すると、stderr しか取得できません。なぜかわからない?Hiveでクエリを実行するとstdoutが膨大になるため、これは問題です。私はほとんどいつもメモリ不足です。

Scaladoc または StackOverflow のいくつかの例で指定されているような次のコードを記述した場合、クエリが少量の行を返す限り、正常に動作します。出力とエラーが表示されます。

val err = new StringBuilder
val out = new StringBuilder
val logger = ProcessLogger(out append _ , err append _ )
val res =  Seq("hive","-e","show tables in ab_testing") ! logger

私の場合、エラーのみに関心があり、出力は気にしません。何百万もの行が返され、メモリが不足します。ドキュメンテーションやブログを掘り下げた後、そのようにすればそう言うようです。エラーのみを受け取る必要があります。

val err = new StringBuilder
val logger = ProcessLogger(err append _ )
val res =  Seq("hive","-e","select * from ab_testing.ab_searches") ! logger

実際にクエリが失敗したり例外をスローした場合、StringBuilder はエラーを取得しますが、これは完璧ですが、クエリが有効な場合でも出力を StringBuilder エラーに送信し、スクリプトがメモリ不足になります。

ProcessLoggerを処理してエラーのみを取得する方法や、出力を除外してエラーのみを保持するためにロガーに別のパイプ演算子を使用する必要があるかどうかはわかりません。

私は Scala Api を掘り下げてその方法を理解しようとしましたが、API の読み取り方法についてはまだ混乱しています。Scala Daily でのコーディングは初めてです。

4

1 に答える 1

1

これはどう?

val logger = ProcessLogger(_ => () , err append _ )

stdout からのものを破棄し、stderr からのものを追加します。後で試したように単一のパラメーターを使用すると、次のように説明されます。

標準とエラーのすべての出力を渡された関数に送信する scala.sys.process.ProcessLogger を作成します。

つまり、stdout と stderr を一緒に取得します。

于 2013-10-03T21:37:40.983 に答える