Select 行,其中数组包含 bigquery 中的几个值之一(最好使用 dbplyr)
Select rows where array contains one of several values in bigquery (ideally with dbplyr)
我在 bigquery 上有大量推文,现在想过滤掉那些至少包含一个主题标签列表的推文。主题标签保存在数组列中(从 R 中的列表列上传)。我如何 select 行在该数组的任何位置包含多个值之一?
下面是我在 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()))
这里的困难部分是您的主题标签列是列表或数组类型。根据 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))
我在 bigquery 上有大量推文,现在想过滤掉那些至少包含一个主题标签列表的推文。主题标签保存在数组列中(从 R 中的列表列上传)。我如何 select 行在该数组的任何位置包含多个值之一?
下面是我在 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()))
这里的困难部分是您的主题标签列是列表或数组类型。根据
两种替代方法:
将您的主题标签转换为字符串并使用文本搜索 (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))