我正在与datalab中的Apache Beam /数据流“玩耍”。 我正在尝试从gcs读取csv文件。 当我使用以下方法创建pcollection时:
lines = p | 'ReadMyFile' >> beam.io.ReadFromText('gs://' + BUCKET_NAME + '/' + input_file, coder='StrUtf8Coder')
我收到以下错误:
LookupError: unknown encoding: "THE","NAME","OF","COLUMNS"
似乎列名被解释为编码?
我不明白怎么了。 如果我未指定“编码器”,我将得到
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe0 in position 1045: invalid continuation byte
外部apache梁,我可以通过从gcs读取文件来处理此错误:
blob = storage.Blob(gs_path, bucket)
data = blob.download_as_string()
data.decode('utf-8', 'ignore')
我读到的Apache Beam仅支持utf8,文件不只包含utf8。
我应该下载然后转换为pcollection吗?
有什么建议吗?
答案 0 :(得分:1)
我建议更改实际文件的编码。如果使用“另存为”保存文件,则可以为excel CSV和常规.txt上的格式选择UTF-8编码。完成后,您需要确保添加一行代码,例如
class DoWork(beam.DoFn):
def process(self, text):
text = textfilePcollection.encode('utf-8')
Do other stuff
这不是我想要的方式,因为它不是以代码为中心的,但是它以前对我有用。不幸的是,我没有以代码为中心的解决方案。
答案 1 :(得分:1)
可能的破解方法是创建一个从Coder
类(apache_beam.coders.coders.Coder)继承的类
from apache_beam.coders.coders import Coder
class ISOCoder(Coder):
"""A coder used for reading and writing strings as ISO-8859-1."""
def encode(self, value):
return value.encode('iso-8859-1')
def decode(self, value):
return value.decode('iso-8859-1')
def is_deterministic(self):
return True
并将其作为参数传递给Beam提供的ReadFromText IO转换(apache_beam.io.textio.ReadFromText) 像这样
from apache_beam.io import ReadFromText
with beam.Pipeline(options=pipeline_options) as p:
new_pcollection = ( p | 'Read From GCS' >>
beam.io.ReadFromText('input_file', coder=ISOCoder())
此处详细说明的逻辑
https://medium.com/@khushboo_16578/cloud-dataflow-and-iso-8859-1-2bb8763cc7c8