我目前在我的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第一次编码。
答案 0 :(得分:1)
这个怎么样?
val logger = ProcessLogger(_ => () , err append _ )
它丢弃stdout中的任何内容,并附加来自stderr的内容。您尝试使用单个参数后面的内容如下所示:
创建一个发送所有输出的scala.sys.process.ProcessLogger, 标准和错误,传递给函数。
这意味着它可以获得所有东西:stdout和stderr在一起。