高级选择 II:SQL
如前所述,当您使用 dplyr 接口时,sparklyr 会先将您的代码转换为 SQL,再传递给 Spark。大多数情况下,这正是您需要的。不过,您也可以直接编写原生 SQL 来完成相同的任务。多数时候这并不明智,因为代码更难编写,也更难调试。然而,如果您希望代码具有可移植性——也就是说,能在 R 之外复用——这可能会很有用。例如,一个常见流程是先用 sparklyr 试验数据处理,然后在生产环境切换为原生 SQL。若从一开始就写原生 SQL,迁移到生产时就能直接复制粘贴查询。
SQL 查询以字符串形式书写,并传递给 DBI 包中的 dbGetQuery()。基本模式如下所示。
query <- "SELECT col1, col2 FROM some_data WHERE some_condition"
a_data.frame <- dbGetQuery(spark_conn, query)
请注意,与您之前编写的 dplyr 代码不同,dbGetQuery() 会立即执行查询并将结果返回到 R。若您希望延迟返回数据,可以使用 dbSendQuery() 执行查询,再用 dbFetch() 取回结果。那属于更高级的用法,此处不展开。另外需要注意,DBI 函数返回的是 data.frame,而不是 tibble,因为 DBI 是一个更底层的包。
如果您想进一步学习如何编写 SQL 代码,建议学习 Introduction to SQL 课程。
本练习是课程的一部分
R 中使用 sparklyr 的 Spark 入门
练习说明
系统已为您创建 Spark 连接 spark_conn。一个附着在 Spark 中曲目元数据上的 tibble 已预定义为 track_metadata_tbl,并可在 SQL 查询中通过 track_metadata 访问。
- 完成查询:从
track_metadataSpark 数据框中选择所有列,条件为year小于 1935 且duration大于 300 秒。 - 调用
dbGetQuery()执行查询,将结果赋给results,然后查看输出。
交互式实操练习
通过完成这段示例代码来试试这个练习。
# Write SQL query
query <- "SELECT ___ FROM ___ WHERE ___ AND ___"
# Run the query
(results <- ___(___, ___))