双片连映
您在前两章看到的 dplyr 方法使用的是 Spark 的 SQL 接口。也就是说,它们会先把您的 R 代码转换成 SQL 代码,再交给 Spark 执行。对于基础的数据操作,这种方式非常好用;但当您需要更复杂的处理时就会遇到限制。例如,您可以计算一列的均值,但无法直接计算中位数。下面是您在第 1 章"汇总列"练习中完成的示例:
track_metadata_tbl %>%
summarize(mean_duration = mean(duration)) #OK
track_metadata_tbl %>%
summarize(median_duration = median(duration))
sparklyr 还提供了两种将在接下来的两章讨论的"原生"接口。所谓原生,是指它们直接调用 Java 或 Scala 代码以访问 Spark 库,而无需转换为 SQL。sparklyr 支持 Spark DataFrame 的 Application Programming Interface (API),对应的函数以 sdf_ 为前缀;同时也支持访问 Spark 的机器学习库 MLlib,其中"特征转换"函数以 ft_ 开头,"机器学习"函数以 ml_ 开头。
与在 R 中工作相比,有一个重要的理念差异:Spark 对变量类型的要求比 R 严格得多。大多数原生函数需要 DoubleType 作为输入,并返回 DoubleType 作为输出。DoubleType 相当于 R 的 numeric 向量类型。sparklyr 会负责把 numeric 转换为 DoubleType,但把 logical 或 integer 数据转换为 numeric 再转换回来,则需要由用户(也就是您)来完成。
以下哪些说法是正确的?
sparklyr的dplyr方法会把代码转换为 Scala 代码后再在 Spark 上运行。- 将 R 代码转换为 SQL 代码会限制可支持的计算数量。
- 大多数 Spark MLlib 建模函数需要
DoubleType输入并返回DoubleType输出。 - 大多数 Spark MLlib 建模函数需要
IntegerType输入并返回BooleanType输出。
本练习是课程的一部分
