从BiqQuery中的单元格中的表中查找字符串 - >查询超出了资源限制

时间:2017-07-31 07:07:05

标签: google-bigquery

我在BigQuery中有两个表:

  • 城市清单:表:invertible-fin-XXX238.Reports.City
  • StationionNames:invertible-fin-XXX238.Reports.Station

大多数包含城市名称的StationNames。现在我想从Station Table中提取城市。 这里有一些示例数据:

  • 城市:柏林
  • Stationname:inStore_Berlin_Alexanderplatz
  • 站名:柏林舍内费尔德机场
  • 站名:柏林火车站特许经营

我尝试了INSTR功能,但没有成功(INSTR仅适用于Legacy SQL,我不能使用SUBSELECTS。)

SELECT City,
INSTR((SELECT AdGroupName 
FROM [invertible-fin-XXX238.Reports.City]),City) AS Match 
FROM [invertible-fin-XXX238.Reports.Station]

因此我尝试了WHERE LIKE。在SQL代码下面:

SELECT a.City
FROM [invertible-fin-XXX238.Reports.City] a
CROSS JOIN [invertible-fin-XXX238.Reports.Station] b
WHERE b. Name LIKE '%' + a.City + '%'
GROUP BY a.City

但是现在查询的计算量太大了,我得到了错误代码“查询超出了第1层的资源限制。需要第18级或更高级别。”返回。

有些人可以帮助我,写一个更加资源友好的查询。

提前致谢, 菲利普

2 个答案:

答案 0 :(得分:1)

以下是BiigQuery Standard SQL

的许多可能版本中的一小部分    
#standardSQL
SELECT city, station
FROM `invertible-fin-XXX238.Reports.Station` AS s
JOIN `invertible-fin-XXX238.Reports.City` AS c
ON REPLACE(LOWER(station), LOWER(city), '') <> LOWER(station)

#standardSQL
SELECT city, station
FROM `invertible-fin-XXX238.Reports.Station` AS s
JOIN `invertible-fin-XXX238.Reports.City` AS c
ON LOWER(station) LIKE CONCAT('%',LOWER(city),'%')

如果City的名称在两个表格中的拼写相同,则可以删除LOWER()函数

虽然上面的版本看起来更直接 - 我更喜欢下面的一个,因为它允许你从车站提取城市的控制方式 - r'([^ _]+)' - 你应该观察到的所有字符都是列站中的分隔符。所以在这种情况下,当它不是较长名称的一部分时,你将只提取城市 当然,你应该验证你是否需要担心这个

#standardSQL
WITH tokens AS (
  SELECT token, station
  FROM `invertible-fin-XXX238.Reports.Station` AS s,
    UNNEST(REGEXP_EXTRACT_ALL(LOWER(station), r'([^ _]+)')) token
) 
SELECT city, station
FROM tokens AS s
JOIN `invertible-fin-XXX238.Reports.City` AS c
ON LOWER(city) = token

答案 1 :(得分:0)

我也想知道在这种情况下子查询的性能如何。例如:

WITH City AS(
SELECT 'Berlin' As Name UNION ALL
SELECT 'Hamburg'
),
StationNames AS(
SELECT 'inStore_Berlin_Alexanderplatz' AS Name UNION ALL
SELECT 'Berlin Schönefeld Airport' UNION ALL
SELECT 'Train Station Franchise Berlin' UNION ALL
SELECT 'Train Station Hamburg' UNION ALL
SELECT 'Train Station Pluton'
)

SELECT
  Name StationName,
  (SELECT Name FROM City c WHERE LOWER(s.Name) LIKE CONCAT('%', LOWER(c.Name), '%')) city
FROM StationNames s

或者在你的情况下:

SELECT
  Name StationName,
  (SELECT Name FROM `invertible-fin-XXX238.Reports.City` c WHERE LOWER(s.Name) LIKE CONCAT('%', LOWER(c.Name), '%')) city
FROM `invertible-fin-XXX238.Reports.Station` s

我知道大多数数据库JOIN比子查询具有更好的性能但BigQuery有很多different optimization techniques用于存储和查询数据是常识,我很想知道性能有多么不同在这种情况下。