ApacheBeam+Python:编写JSON(或字典)字符串以输出fi

2024-10-01 15:39:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用一个Beam管道,以便将SequenceMatcher函数应用于大量单词。我(希望)除了WriteToText部分之外,什么都搞定了。在

我定义了一个定制的ParDo(这里称为ProcessDataDoFn),它接受主输入和副输入,处理它们并输出像下面这样的字典

{u'key': (u'string', float)}

我的管道很简单

^{pr2}$

现在的问题是,如果我像这样离开管道,它只输出output_字典的键。如果我将ProcessDataDoFn的返回改为json.dumps文件(output_dictionary),Json的编写是正确的,但是如下所示

{
'
k
e
y
'

:

[
'
s
t
r
i
n
g
'

,

f
l
o
a
t
]

如何正确输出结果?在


Tags: key函数outputstring字典管道定义float
2条回答

你的输出看起来像那样是不寻常的。json.dumps应该在一行中打印json,并且应该逐行输出到文件。在

也许为了获得更简洁的代码,可以添加一个额外的映射操作,该操作以您需要的方式进行格式化。大概是这样的:

output = (
  main_input
  | 'ProcessData' >> beam.ParDo(
        ProcessDataDoFn(),
        side_input=beam.pvalue.AsList(side_input))
  | 'FormatOutput' >> beam.Map(json.dumps)
  | 'WriteOutput' >> beam.io.WriteToText(GCS_BUCKET)
)

我实际上部分地解决了这个问题。在

我编写的pardoff要么返回字典,要么返回JSON格式的字符串。在这两种情况下,当Beam试图用所述输入进行操作时,问题就出现了。Beam似乎在一个给定的PCollection上迭代,如果这个PCollection是一个字典,它只获取它的键,如果所说的PCollection是一个字符串,它会遍历所有字符(这就是JSON输出如此奇怪的原因)。我发现解决方案相当简单:将字典或字符串封装在列表中。JSON格式化部分可以在ParDoFn级别完成,也可以通过类似于您所示的转换来完成。在

相关问题 更多 >

    热门问题