TreasureData
digdag

digdagのtd>のdownload_file

More than 1 year has passed since last update.

MalformedInputExceptionになることがある → 0.8.19で解消済

digdag(執筆当時0.8.16くらいだったか)のtd>:にdownload_file:を指定すると、うまくいく場合と以下のエラーでうまくいかない場合がある
データによるっぽい?

    java.nio.charset.MalformedInputException: Input length = 1
org.msgpack.core.MessageStringCodingException: java.nio.charset.MalformedInputException: Input length = 1
       at org.msgpack.value.impl.AbstractImmutableRawValue.asString(AbstractImmutableRawValue.java:72)
       at io.digdag.standards.operator.td.TdOperatorFactory.addCsvValue(TdOperatorFactory.java:390)
       at io.digdag.standards.operator.td.TdOperatorFactory.addCsvRow(TdOperatorFactory.java:334)
       at io.digdag.standards.operator.td.TdOperatorFactory.lambda$downloadJobResult$0(TdOperatorFactory.java:304)
       at io.digdag.standards.operator.td.TDJobOperator.lambda$null$3(TDJobOperator.java:105)
       at com.treasuredata.client.TDHttpClient.call(TDHttpClient.java:442)
       at com.treasuredata.client.TDClient.jobResult(TDClient.java:597)
       at io.digdag.standards.operator.td.TDJobOperator.lambda$getResult$4(TDJobOperator.java:103)
       at io.digdag.util.RetryExecutor.run(RetryExecutor.java:158)
       at io.digdag.util.RetryExecutor.run(RetryExecutor.java:133)
       at io.digdag.standards.operator.td.TDJobOperator.getResult(TDJobOperator.java:102)
       at io.digdag.standards.operator.td.TdOperatorFactory.downloadJobResult(TdOperatorFactory.java:299)
       at io.digdag.standards.operator.td.TdOperatorFactory$TdOperator.processJobResult(TdOperatorFactory.java:124)
       at io.digdag.standards.operator.td.BaseTdJobOperator.runTask(BaseTdJobOperator.java:57)
       at io.digdag.util.BaseOperator.run(BaseOperator.java:51)
       at io.digdag.core.agent.OperatorManager.callExecutor(OperatorManager.java:297)
       at io.digdag.cli.Run$OperatorManagerWithSkip.callExecutor(Run.java:676)
       at io.digdag.core.agent.OperatorManager.runWithWorkspace(OperatorManager.java:241)
       at io.digdag.core.agent.OperatorManager.lambda$runWithHeartbeat$2(OperatorManager.java:134)
       at io.digdag.core.agent.NoopWorkspaceManager.withExtractedArchive(NoopWorkspaceManager.java:20)
       at io.digdag.core.agent.OperatorManager.runWithHeartbeat(OperatorManager.java:132)
       at io.digdag.core.agent.OperatorManager.run(OperatorManager.java:116)
       at io.digdag.cli.Run$OperatorManagerWithSkip.run(Run.java:658)

起きたときには以下で回避(★)

+step1:
  td>: XXX.sql
# download_file: XXX.csv
+step2:
  sh>: td job:show ${td.last_job_id} -f csv -o XXX.csv --column-header

2016/11/17追記:ver.0.8.19で解消済とのこと(試していないが) → http://docs.digdag.io/releases/release-0.8.19.html#workflow-changes

サーバモードだと次タスクで読めない

カレントディレクトリにダウンロードするので、ローカルモードなら次タスクで読める
しかしサーバモードだとタスク毎に専用ディレクトリが作られてその中で当該タスクが実行されて当該タスクが終わると当該ディレクトリは消えるのでダウンロードしたファイルを次タスクで読むことはできない
かといって「download_file: /tmp/XXX.csv」とか「download_file: ../XXX.csv」とか指定すると「プロジェクトディレクトリ外は指定不可」エラーになる

しかたないので前述の★で回避 (-o /tmp/XXX.csv)