从 Minio 读取 Dask 会引发将二进制字符串 JSON 读取/转换为 utf8 的问题

Read into Dask from Minio raises issue with reading / converting binary string JSON into utf8

我正在尝试将 JSON-LD 从 Minio 读入 Dask。管道工作但字符串来自 Minio 作为二进制字符串

所以

with oss.open('gleaner/summoned/repo/file.jsonld', 'rb') as f:
  print(f.read())

结果

b'\n{\n    "@context": "http://schema.org/",\n    "@type": "Dataset",\n  ...

我可以简单地将其转换为

with oss.open('gleaner/summoned/repo/file.jsonld', 'rb') as f:
   print(f.read().decode("utf-8"))

现在一切都如我所料。

但是,我正在使用 Dask 并在使用

读取包时
dgraphs = db.read_text('s3://bucket/prefa/prefb/*.jsonld', 
      storage_options={
          "key": key,
          "secret": secret,
          "client_kwargs": {"endpoint_url":"https://example.org"}
          }).map(json.loads)

我无法让来自 Minio 的内容变成字符串与二进制字符串。我需要在它们到达我怀疑的 json.loads 地图之前转换它们。

我想我也可以在这里以某种方式注入“解码”,但我无法解决如何。

谢谢

顾名思义,read_text以文本方式打开远程文件,相当于open(..., 'rt')read_textsignature 包括各种解码参数,例如 UTF8 作为默认编码。您不需要执行任何其他操作,但如果您遇到问题,请post具体错误,最好是示例文件内容。

如果您的数据不是由行分隔的,read_text 可能不适合您,您可以这样做

@dask.delayed()
def read_a_file(fn):
    # or preferably open in text mode and json.load from the file
    with oss.open('gleaner/summoned/repo/file.jsonld', 'rb') as f:
        return json.loads(f.read().decode("utf-8"))

output = [read_a_file(f) for f in filenames]

然后您可以根据需要从中创建包或数据框。