【发布时间】:2018-04-25 10:03:46
【问题描述】:
问题陈述:
我有两个表 - Data (40 cols) 和 LookUp(2 cols) 。我需要在带有查找表的数据表中使用 col10 来提取相关值。 但是我不能让 equi join 。我需要一个基于 like/contains 的连接,因为查找表中的值仅包含数据表中值的部分内容而不是完整值。因此需要一些基于正则表达式的匹配。
数据大小:
- 数据表:大约 - 23 亿个条目(1 TB 数据)
- 查表:大约 140 万个条目(50 MB 数据)
方法一:
1.使用数据库(我使用的是 Google Big Query)- 基于 like 的 Join 需要接近 3 小时,但它没有返回任何结果。我相信基于正则表达式的连接会导致笛卡尔连接。
- 使用 Apache Beam/Spark - 我尝试为查找表构建一个 Trie,然后将其共享/广播到工作节点。但是,使用这种方法时,由于创建了太多字符串,我会遇到 OOM。我尝试将每个工作节点的内存增加到 4GB+,但无济于事。 我正在使用 Trie 提取最长的匹配前缀。
我愿意使用其他技术,如 Apache spark、Redis 等。 请建议我如何处理这个问题。
此处理需要每天执行,因此需要优化时间和资源。
【问题讨论】:
-
尝试一些信封样式的计算。在单个 CPU 内核上,您认为每秒可以计算多少个字符串比较?将该数字乘以 23 亿,然后将该结果乘以 140 万。
-
感谢您的回复。但是,我期待更多关于可以更有效地解决问题的替代算法或设计方法。
-
很高兴看到您的用例的更多详细信息!任何域细节?查找表中 col10 和 2 cols 的任何示例?有时小细节可以改变游戏规则!
-
如何为主表使用 BQ 分区,然后为每个分区预先计算该值并将其存储回 BQ 中?理论上,您将使用查找表连接更小的表/分区。类似的东西?更多信息会有所帮助。
-
@MatjazMuhic - 数据用于单个分区。整个表在 100+TB 中。
标签: apache-spark google-bigquery google-cloud-dataflow apache-beam lookup-tables