簡體   English   中英

Apache-Beam + Python:將JSON(或字典)字符串寫入輸出文件

[英]Apache-Beam + Python: Writing JSON (or dictionaries) strings to output file

我正在嘗試使用Beam管道,以便將SequenceMatcher函數應用於大量單詞。 我(希望)除了WriteToText部分之外已經想出了所有的東西。

我已經定義了一個自定義ParDo(在此稱為ProcessDataDoFn),它接受main_input和side_input,處理它們並輸出像這樣的字典

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

我的管道非常簡單

class ProcessDataDoFn(beam.DoFn):
    def process(self, element, side_input):

    ... Series of operations ...

    return output_dictionary

with beam.Pipeline(options=options) as p:

    # Main input
    main_input = p | 'ReadMainInput' >> beam.io.Read(
        beam.io.BigQuerySource(
            query=CUSTOM_SQL,
            use_standard_sql=True
        ))

    # Side input
    side_input = p | 'ReadSideInput' >> beam.io.Read(
        beam.io.BigQuerySource(
            project=PROJECT_ID,
            dataset=DATASET,
            table=TABLE
        ))

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

現在的問題是,如果我像這樣離開管道,它只輸出output_dictionary的鍵。 如果我將ProcessDataDoFn的返回值更改為json.dumps(ouput_dictionary),則Json寫得正確但是像這樣

{
'
k
e
y
'

:

[
'
s
t
r
i
n
g
'

,

f
l
o
a
t
]

如何正確輸出結果?

我實際上部分解決了這個問題。

我寫的ParDoFn返回字典或JSON格式的字符串。 在這兩種情況下,當Beam試圖對所述輸入做某事時會出現問題。 如果所述PCollection是字典,則Beam似乎迭代給定的PCollection,它只獲取其密鑰,如果所述PCollection是字符串,則迭代所有字符(這就是JSON輸出如此奇怪的原因)。 我發現解決方案相當簡單:將字典或字符串封裝在列表中。 JSON格式化部分既可以在ParDoFn級別完成,也可以通過您所展示的變換完成。

你的輸出看起來很不尋常。 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)
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM