选择行,其中数组包含bigquery中的多个值之一最好是dbplyr

问题描述

我在bigquery上有大量推文,现在想过滤那些至少包含一个#hashtags的推文。主题标签保存在数组列中(从R中的列表列上载)。如何在该数组中的任何位置选择包含多个值之一的行?

下面我将在R中用于分析的代码下面。毫无疑问,dbplyr无法翻译purrr部分,我很高兴学习自己创建sql,但是还没有找到了一个很好的起点。感谢您的指导。

PS:我尚未将Tweets上传到bigquery,它们当前存在于80 GB的RDS中。如果有任何简单的数据转换可以简化此操作,我仍然可以在上传时将其包括在内。

tweets_sample <- tibble::tribble(
  ~text,~hashtags,"Hello",list("World","You"),"Goodbye",list("Friend","Not",list("interested")
)

hashtag_list <- c("World","interested")

tweets_sample %>% filter(purrr::map_lgl(hashtags,~ .x %in% hashtag_list %>%
                                   any()))

解决方法

这里的难点是您的标签列是列表或数组类型。根据{{​​3}}的dbplyr转换,似乎无法很好地建立数组等更高级的数据类型。

两种替代方法:

  1. 将主题标签转换为字符串并使用文本搜索(grep)。

  2. 在R中将bigquery查询写为字符串并将其附加到现有连接。这是一个示例:

db_connection = DBI::dbConnect( ... ) # connect to database
remote_tbl = dplyr::tbl(db_connection,from = "remote_table_name")

# build SQL query
sql_query <- glue::glue("SELECT *\n","FROM (\n","{dbplyr::sql_render(remote_tbl)}\n",") alias\n",new_remote_table = dplyr::tbl(db_connection,dbplyr::sql(sql_query))