选择数组包含 bigquery 中多个值之一的行(最好使用 dbplyr)
Posted
技术标签:
【中文标题】选择数组包含 bigquery 中多个值之一的行(最好使用 dbplyr)【英文标题】:Select rows where array contains one of several values in bigquery (ideally with dbplyr) 【发布时间】:2020-10-14 12:43:13 【问题描述】:我有大量关于 bigquery 的推文,现在想要过滤那些至少包含一个主题标签列表的推文。主题标签保存在数组列中(从 R 中的列表列上传)。如何在该数组的任何位置选择包含多个值之一的行?
在我将用于在 R 中进行分析的代码下方。不出所料,dbplyr
无法翻译 purrr
部分,我很高兴自己学习创建 SQL,但还没有找到一个好的开始观点。感谢您的任何指点。
PS:我还没有将推文上传到 bigquery,它们目前存在于 80 GB 的 RDS 文件中。如果任何简单的数据转换可以使这更容易,我仍然可以在上传时包含它。
tweets_sample <- tibble::tribble(
~text, ~hashtags,
"Hello", list("World", "You"),
"Goodbye", list("Friend", "You"),
"Not", list("interested")
)
hashtag_list <- c("World", "interested")
tweets_sample %>% filter(purrr::map_lgl(hashtags, ~ .x %in% hashtag_list %>%
any()))
【问题讨论】:
【参考方案1】:这里的困难部分是您的主题标签列是列表或数组类型。根据this question dbplyr 对更高级数据类型(如数组)的翻译似乎还没有很好地建立。
两种替代方法:
将您的主题标签转换为字符串并使用文本搜索 (grep)。
在 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))
【讨论】:
谢谢!在这种情况下,(1)实际上可能效果很好,特别是因为它可以更容易地处理相似但不相同的主题标签。 Re 2,仅供参考,我做了一些挖掘,发现 bigquery SQL 需要如下所示:SELECT * FROMtweets1
WHERE ('WomensDay' IN UNNEST(hashtags) OR 'Eurovision' IN UNNEST(主题标签)或 UNNEST 中的“英国退欧”(主题标签))以上是关于选择数组包含 bigquery 中多个值之一的行(最好使用 dbplyr)的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery - 如何取消嵌套多个数组,并从一列分配值?