问题陈述:
我有两个表 - 数据(40列)和LookUp(2列)。我需要在数据表中使用col10和查找表来提取相关值。 但是我无法进行equi加入。我需要一个基于like / contains的连接,因为查找表中的值只包含Data表中不是完整值的部分内容值。因此,需要一些基于正则表达式的匹配。
数据大小:
方法1:
1.使用数据库(我正在使用Google Big Query) - 基于类似的加入需要接近3小时,但它不会返回任何结果。我相信基于Regex的加入会导致笛卡尔加入。
我愿意使用Apache spark,Redis等其他技术。 建议我如何处理这个问题。
此处理需要在日常的基础上进行,因此需要优化时间和资源。
答案 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