当前位置: 首页 > 面试题库 >

BigQuery-复杂的相关查询

陆沈浪
2023-03-14
问题内容

我正在尝试查询Google
BigQuery公共Reddit数据集。我的目标是使用Jaccards’Index来计算子reddit的相似性,该索引的定义如下:

我的计划是在2016年8月按评论数选择前N = 1000个子项,然后计算其笛卡尔积,以得到subreddit1, subreddit2形状中所有子项的组合。

然后使用这些组合的行来查询subreddit1和subreddit 2之间的用户并集以及交集。

我到目前为止的查询是这样的:

SELECT 
  subreddit1,
  subreddit2,
  (SELECT 
    COUNT(DISTINCT author)
  FROM `fh-bigquery.reddit_comments.2016_08`
  WHERE subreddit = subreddit1
    OR subreddit = subreddit2
  LIMIT 1
  ) as subreddits_union,

  (
    SELECT 
      COUNT(DISTINCT author)
    FROM `fh-bigquery.reddit_comments.2016_08`
    WHERE subreddit = subreddit1
    AND author IN ( 
       SELECT author 
       FROM `fh-bigquery.reddit_comments.2016_08`
       WHERE subreddit= subreddit2
       GROUP BY author 
      ) as subreddits_intersection

FROM

(SELECT a.subreddit as subreddit1, b.subreddit as subreddit2
 FROM  (
   SELECT subreddit, count(*) as n_comments
   FROM `fh-bigquery.reddit_comments.2016_08`
   GROUP BY subreddit
   ORDER BY n_comments DESC
   LIMIT 1000
   ) a
 CROSS JOIN (
   SELECT subreddit, count(*) as n_comments
   FROM `fh-bigquery.reddit_comments.2016_08`
   GROUP BY subreddit
   ORDER BY n_comments DESC
   LIMIT 1000
   ) b
 WHERE a.subreddit < b.subreddit
  )

理想情况下会给出以下结果:

subreddit1, subreddit2, subreddits_union, subreddits_interception
-----------------------------------------------------------------
   Art     |  Politics |      50000      |      21000
   Art     |  Science  |      92320      |      15000
   ...     |  ...      |      ...        |      ...

但是,此查询给我以下BigQuery错误: Error: Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN.

我了解的。但是,我认为此查询不能转换为有效的联接。鉴于BQ没有apply方法,是否有任何方法可以设置此查询而无需诉诸单个查询?也许有一个PARTITION BY


问题答案:

感谢您的回答。这个在返回subreddit联合中效果很好,但是,您将如何实现交集呢?

也许有些类似的东西

WITH top_most AS (
   SELECT subreddit, count(*) as n_comments
   FROM `fh-bigquery.reddit_comments.2016_08`
   GROUP BY subreddit
   ORDER BY n_comments DESC
   LIMIT 20
),
authors AS (
  SELECT DISTINCT author, subreddit
  FROM `fh-bigquery.reddit_comments.2016_08`
)
SELECT 
count(DISTINCT a1.author),
subreddit1, subreddit2
FROM
(
  SELECT t1.subreddit subreddit1, t2.subreddit subreddit2
  FROM top_most t1 CROSS JOIN top_most t2 LIMIT 1000000
)
INNER JOIN authors a1 on a1.subreddit = subreddit1
INNER JOIN authors a2 on a2.subreddit = subreddit2
WHERE a1.author = a2.author
GROUP BY subreddit1, subreddit2
ORDER BY subreddit1, subreddit2


 类似资料:
  • 我有这个: 如何从hashlist中排除“item”?打破了我的头。Linq不想对我开放。

  • 问题内容: 表Words_Learned包含用户已知的所有单词以及 单词学习的顺序。它具有3列:1)单词ID和2)用户ID,以及3) 单词学习的顺序。 表中Article包含文章。它具有3列:1)文章ID,2) 唯一字数和3)文章内容。 该表Words包含每篇文章中包含的所有唯一单词的列表。 它有2列1)单词ID和2)文章ID 数据库图如下/ 在此处输入图片说明 您可以从此处下载数据库代码:htt

  • 我使用Spring JPA规范来创建标准查询。我的代码如下所示: 我被告知这是一种糟糕的方法,我应该使用投影(DTO)从数据库中读取,因为创建实体并在之后映射它们很昂贵。问题是我不知道如何将规范与DTO相结合。要使用包含嵌套 DTO 和大量属性的复杂 DTO 来管理复杂和动态查询(来自用户输入的筛选器等)的最佳方式是什么?

  • 问题内容: 我正在寻找一种在REST API中为搜索查询建模的可靠方法。 在我的api中,您可以使用查询参数在资源的URI中指定搜索条件。 例如: 在服务器端,搜索字符串映射到所需的基础技术。根据其余资源,这可以是一个SQL查询,Hibernate Criteria api,另一个Web服务调用,… 这两个示例很简单,足以支持,但是我还需要更复杂的搜索功能,例如子字符串搜索,日期前后的搜索,NOT

  • 问题内容: 假设我有一个事件()实例,其中有许多,则需要获取属于的所有对象,其中AttendancePerson.person参加了多个事件,该事件的 相匹配,并且在上一年结束的位置。 模式减去不相关的列名: 目的是找到任何给定事件的老成员。在上一年中多次参加共享同一日历的活动的任何活动出席者都是该活动的“老会员”。 我阅读了许多相关的问题。他们都没有帮助。谢谢任何对此有帮助的人。 问题答案: 对

  • 问题内容: 我有以下ManyToMany映射。 我想检索与Classe2实体有关系的所有Class1实体,其中class2Id = 1和class2Id = 2和class2Id = 3。{1,2,3} 或者,要过滤在其class2列表上具有的Classe1实体,请使用具有以下值的Class2实体:class2Id = 1和class2Id = 2和class2Id = 3 例如: 如果在联接表上