管道中具有hdfs支持的梁的Python代码

时间:2019-01-16 10:17:43

标签: apache-beam apache-beam-io tensorflow-transform

我在这里运行Sentiment示例以进行张量流转换。 https://github.com/tensorflow/transform/blob/master/examples/sentiment_example.py

对于第78-98行中定义的fn ReadAndShuffleData(),是否可以通过类似的方式加载文件,但可以从HDFS而不是GCS加载文件?

我整天尝试了几种Beam API(beams-2.8.0),但失败了,我认为最有前途的就是使用beams.io.hadoopfilesystem。但是,此fn实际上产生了一个python文件对象,并且无法在束流水线中使用beams.io.ReadFromText()来读取。

我还正确传递了HadoopFileSystemPipelineOptions。任何人都可以告诉我解决该问题的方向,2/3行代码段或解决方法?非常感谢你!

p.s。 hadoop 2.7.7,波束2.8和数据已正确加载。

我想我可能在这里缺乏一些理论上的理解,任何参考文献将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以使用apache_beam.Create转换:

  

初始化签名:beam.Create(自身,值,reshuffle = True)

     

文档字符串:一种通过迭代器创建PCollection的转换。

import apache_beam as beam
from apache_beam.options.pipeline_options import HadoopFileSystemOptions
from apache_beam.io.hadoopfilesystem import HadoopFileSystem

HDFS_HOSTNAME = 'foo.hadoop.com'
HDFS_PORT = 50070
hdfs_client_options = HadoopFileSystemOptions(hdfs_host=HDFS_HOSTNAME, hdfs_port=HDFS_PORT, hdfs_user="foobar")
hdfs_client = HadoopFileSystem(hdfs_client_options)

input_file_hdfs = "hdfs://foo/bar.csv"
f = hdfs_client.open(input_file_hdfs)

p = beam.Pipeline(options=PipelineOptions())
lines = p | 'ReadMyFile' >> beam.Create(f)
res = lines | "WriteMyFile" >> beam.io.WriteToText("./bar", ".csv")
p.run()