使用大查找表

时间:2018-04-25 10:03:47

标签: apache-spark google-bigquery google-cloud-dataflow apache-beam lookup-tables

问题陈述:

我有两个表 - 数据(40列)和LookUp(2列)。我需要在数据表中使用col10和查找表来提取相关值。 但是我无法进行equi加入。我需要一个基于like / contains的连接,因为查找表中的值只包含Data表中不是完整值的部分内容值。因此,需要一些基于正则表达式的匹配。

数据大小:

  1. 数据表:约23亿条目(1 TB数据)
  2. 查找表:大约140万条目(50 MB数据)
  3. 方法1:

    1.使用数据库(我正在使用Google Big Query) - 基于类似的加入需要接近3小时,但它不会返回任何结果。我相信基于Regex的加入会导致笛卡尔加入。

    1. 使用Apache Beam / Spark - 我试图为查找表构建一个Trie,然后将其共享/广播到工作节点。但是通过这种方法,我正在创建OOM,因为我创建了太多的字符串。我尝试将内存增加到4GB +每个工作节点,但无济于事。 我正在使用Trie提取最长的匹配前缀。
    2. 我愿意使用Apache spark,Redis等其他技术。 建议我如何处理这个问题。

      此处理需要在日常的基础上进行,因此需要优化时间和资源。

1 个答案:

答案 0 :(得分:1)

  

但我无法进行马术加入

以下只是为了让您了解如何在纯BigQuery中解决您的equi join相关问题

这是基于我从您的评论中得出的假设 - 并且当您正在寻找从右到左的最长匹配时 - 涵盖用例 - 中间的匹配不合格

方法是反转url(col10)和shortened_url(col2)字段,然后SPLIT()它们和UNNEST()保留位置

UNNEST(SPLIT(REVERSE(field), '.')) part WITH OFFSET position  

完成此操作后,现在您可以执行equi join,这可能会在某种程度上解决您的问题 那么,你按部分和位置加入然后GROUP BY原始url和shortened_url,同时只留下那些匹配计数等于shorteded_url中的部件数量的组,最后是GROUP BY url并且只保留匹配部件数量最多的条目

希望这可以提供帮助:o)

这适用于BigQuery Standard SQL

   
#standardSQL
WITH data_table AS (
  SELECT 'cn456.abcd.tech.com' url UNION ALL
  SELECT 'cn457.abc.tech.com' UNION ALL
  SELECT 'cn458.ab.com'
), lookup_table AS (
  SELECT 'tech.com' shortened_url, 1 val UNION ALL
  SELECT 'abcd.tech.com', 2
), data_table_parts AS (
  SELECT url, x, y
  FROM data_table, UNNEST(SPLIT(REVERSE(url), '.')) x WITH OFFSET y
), lookup_table_parts AS (
  SELECT shortened_url, a, b, val, 
    ARRAY_LENGTH(SPLIT(REVERSE(shortened_url), '.')) len
  FROM lookup_table, UNNEST(SPLIT(REVERSE(shortened_url), '.')) a WITH OFFSET b
)
SELECT url, 
  ARRAY_AGG(STRUCT(shortened_url, val) ORDER BY weight DESC LIMIT 1)[OFFSET(0)].* 
FROM (
  SELECT url, shortened_url, COUNT(1) weight, ANY_VALUE(val) val
  FROM data_table_parts d
  JOIN lookup_table_parts l
  ON x = a AND y = b
  GROUP BY url, shortened_url
  HAVING weight = ANY_VALUE(len)
)
GROUP BY url  

结果为

Row url                 shortened_url   val  
1   cn457.abc.tech.com  tech.com        1    
2   cn456.abcd.tech.com abcd.tech.com   2