问题描述
我在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转换,似乎无法很好地建立数组等更高级的数据类型。
两种替代方法:
-
将主题标签转换为字符串并使用文本搜索(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))