3

我目前使用 Scala 在我的 Linux 环境中编写脚本。我将它用作 Hive 中的 ETL 过程。使用 ProcessLogger 类时,我不能只获取标准错误。不知道为什么?这是一个问题,因为当您在 Hive 中进行查询时标准输出非常庞大。我几乎总是内存不足。

如果我编写以下代码,就像在 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 _ )

它丢弃标准输出中的任何内容,并附加标准错误中的内容。在后面尝试使用单个参数的描述如下:

创建一个 scala.sys.process.ProcessLogger,它将所有输出(标准和错误)发送到传递的函数。

这意味着它将得到一切:stdout 和 stderr。

于 2013-10-03T21:37:40.983 回答