【问题标题】:Splitting .txt file into elements将 .txt 文件拆分为元素
【发布时间】:2019-09-27 16:24:11
【问题描述】:

由于我们不能直接从 Json 文件中读取,我使用的是 .txt 文件。 它看起来像更多的元素由“,”分隔。

[
  {
    "Item_Identifier": "FDW58", 
    "Outlet_Size": "Medium"

  },
  {
    "Item_Identifier": "FDW14",
    "Outlet_Size": "Small"
  },
]

我想计算元素的数量,这里我会得到 2。 问题是我无法将文本分隔成用逗号“,”分隔的元素。 即使将其转换为 json 格式,我也会单独获取每一行。

lines = p | 'receive_data' >> beam.io.ReadFromText(
    known_args.input)\
    | 'jsondumps' >> beam.Map(lambda x: json.dumps(x))\
    | 'jsonloads' >> beam.Map(lambda x: json.loads(x))\
    | 'print' >> beam.ParDo(PrintFn()) \

【问题讨论】:

    标签: python json google-cloud-platform apache-beam


    【解决方案1】:

    我不认为这是一种安全的方法。我没有使用过python sdk(我使用java),但是java端的io.TextIO很清楚它会发出一个PCollection,其中每个元素都是源文件的一行输入。分层数据格式(json、xml 等)不能修改为以这种方式拆分。

    如果您的文件格式与您包含的 json 一样良好且非嵌套,则可以:

    • 逐行读取文件(我相信您正在这样做)
    • 仅过滤包含} 的行
    • 计算生成的 pcollection 大小

    不过,为了更普遍地与 json 集成,我们采用了不同的方法:

    • 从字符串的 PCollection 开始,其中每个值都是文件的路径
    • 使用本机库访问文件并以流方式解析它(我们使用 scala,它有一些可用的流 json 解析库)
      • 或者,使用 Beam 的 API 从 MatchResult 获取 ReadableFile 实例并通过该实例访问文件

    我的理解是,并非所有文件格式都适合分布式处理器。例如,Gzip 不能轻易“拆分”或分块。与 JSON 相同。 CSV 存在一个问题,即值是无意义的,除非您也有方便的开头行。

    【讨论】:

      【解决方案2】:

      .json 文件只是一个文本文件,其内容为 JSON 可解析格式。

      您的 JSON 无效,因为它有尾随逗号。这应该有效:

      import json
      
      j = r"""
      [
          {
              "Item_Identifier": "FDW58",
              "Outlet_Size": "Medium"
          },
          {
              "Item_Identifier": "FDW14",
              "Outlet_Size": "Small"
          }
      ]
      """
      
      print(json.loads(j))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多