收集Apache Beam管道的输出并将其显示到控制台

时间:2017-09-25 13:26:49

标签: apache-beam

我已经在Apache Beam上工作了几天。我想快速迭代我正在工作的应用程序,并确保我正在构建的管道没有错误。在spark中,我们可以使用sc.parallelise,当我们应用某些操作时,我们可以获得可以检查的值。

同样当我阅读Apache Beam时,我发现我们可以使用以下语法创建PCollection并使用它

with beam.Pipeline() as pipeline:
    lines = pipeline | beam.Create(["this is test", "this is another test"])
    word_count = (lines 
                  | "Word" >> beam.ParDo(lambda line: line.split(" "))
                  | "Pair of One" >> beam.Map(lambda w: (w, 1))
                  | "Group" >> beam.GroupByKey()
                  | "Count" >> beam.Map(lambda (w, o): (w, sum(o))))
    result = pipeline.run()

我实际上想将结果打印到控制台。但我无法找到任何有关它的文档。

  

有没有办法将结果打印到控制台而不是每次都将其保存到文件中?

4 个答案:

答案 0 :(得分:3)

进一步探索并了解如何为我的应用程序编写测试用例后,我想出了将结果打印到控制台的方法。请注意,我现在正在将所有内容运行到单个节点计算机并尝试了解apache beam提供的功能,如何在不影响行业最佳实践的情况下采用它。

所以,这是我的解决方案。在我们管道的最后阶段,我们可以引入一个map函数,它将结果打印到控制台或将结果累积到一个变量中,稍后我们可以打印变量来查看值

import apache_beam as beam

# lets have a sample string
data = ["this is sample data", "this is yet another sample data"]

# create a pipeline
pipeline = beam.Pipeline()
counts = (pipeline | "create" >> beam.Create(data)
    | "split" >> beam.ParDo(lambda row: row.split(" "))
    | "pair" >> beam.Map(lambda w: (w, 1))
    | "group" >> beam.CombinePerKey(sum))

# lets collect our result with a map transformation into output array
output = []
def collect(row):
    output.append(row)
    return True

counts | "print" >> beam.Map(collect)

# Run the pipeline
result = pipeline.run()

# lets wait until result a available
result.wait_until_finish()

# print the output
print output

答案 1 :(得分:3)

您不需要临时列表。在python 2.7中,以下内容应该足够了:

 for(row in 0 until table!!.size)
   tableF!![row] = table!![row].clone() // and copyOf()

在python 3.x中,def print_row(row): print row (pipeline | ... | "print" >> beam.Map(print_row) ) result = pipeline.run() result.wait_until_finish() 是一个函数,所以以下就足够了:

print

答案 2 :(得分:0)

我知道这不是你要求的,但为什么不把它存放到文本文件中?它总是比通过stdout打印更好,而且它不易变质

答案 3 :(得分:0)

按照pycharm Edu的示例

import apache_beam as beam

class LogElements(beam.PTransform):
    class _LoggingFn(beam.DoFn):

        def __init__(self, prefix=''):
            super(LogElements._LoggingFn, self).__init__()
            self.prefix = prefix

        def process(self, element, **kwargs):
            print self.prefix + str(element)
            yield element

    def __init__(self, label=None, prefix=''):
        super(LogElements, self).__init__(label)
        self.prefix = prefix

    def expand(self, input):
        input | beam.ParDo(self._LoggingFn(self.prefix))

class MultiplyByTenDoFn(beam.DoFn):

    def process(self, element):
        yield element * 10

p = beam.Pipeline()

(p | beam.Create([1, 2, 3, 4, 5])
   | beam.ParDo(MultiplyByTenDoFn())
   | LogElements())

p.run()

输出

10
20
30
40
50
Out[10]: <apache_beam.runners.portability.fn_api_runner.RunnerResult at 0x7ff41418a210>