我有一个管道,它获取文件的 URL,并下载这些文件,为除 header 之外的每一行生成 BigQuery 表行。
为了避免重复下载,我想对照之前下载的 URL 表检查 URL,并且仅在该“历史记录”表中尚不存在该 URL 时才继续存储该 URL。
为此,我需要将历史记录存储在允许唯一值的数据库中,或者使用 BigQuery 也可能更容易,但对表的访问必须严格是串行的。
我可以强制执行单线程执行(在一台机器上)来满足仅部分管道的要求吗?
(在此之后,我的 100 个 URL/文件中的每一个都适合在单独的线程上处理;每个文件都会产生 10000-10000000 行,因此此时的限制几乎肯定不会产生性能问题。 )
最佳答案
Beam 专为并行处理数据而设计,它会尝试显式阻止您同步或阻塞,除非使用一些内置原语,例如 Combine .
听起来您想要的是一个过滤器,仅在第一次看到元素(您的 URL)时才发出该元素。您也许可以使用内置的 Distinct transform为了这。此运算符使用“Combine per-key”按键(在本例中为您的 URL)对元素进行分组,然后仅在第一次看到每个键时发出每个键。
关于java - 我可以强制数据流管道中的步骤为单线程(并且在单台计算机上)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57360621/