选择数组包含 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 * FROM tweets1 WHERE ('WomensDay' IN UNNEST(hashtags) OR 'Eurovision' IN UNNEST(主题标签)或 UNNEST 中的“英国退欧”(主题标签))

以上是关于选择数组包含 bigquery 中多个值之一的行(最好使用 dbplyr)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 标准 SQL 中取消嵌套多个数组

使用不同表中的行“扩展”BigQuery 数组

BigQuery - 如何取消嵌套多个数组,并从一列分配值?

选择嵌套 JSON 数组包含特定值的行

通过选择多个属性值之一从数组中获取 JavaScript 对象 [关闭]

如何在没有交叉产品的情况下从 BigQuery 中的两列中取消嵌套两个列表,作为单独的行