dplyr::copy_to 和 sparklyr::sdf_copy_to 有啥区别?

Posted

技术标签:

【中文标题】dplyr::copy_to 和 sparklyr::sdf_copy_to 有啥区别?【英文标题】:what is the difference between dplyr::copy_to and sparklyr::sdf_copy_to?dplyr::copy_to 和 sparklyr::sdf_copy_to 有什么区别? 【发布时间】:2019-10-02 13:37:51 【问题描述】:

我正在使用 sparklyr 库与“spark”进行交互。有一些函数可以将数据框放入 spark 上下文中。此类函数为“dplyr::copy_to”和“sparklyr::sdf_copy_to”。有什么区别以及何时建议使用其中一种而不是另一种?

【问题讨论】:

sparklyrone 是为 spark 数据帧实现的(遵循分布式环境中的 RDD 概念),而dplyr 适用于 R 数据帧、小标题等......这就是你在问?我不太确定 这回答了我问题的第一部分第二部分是:它们的表现是否相同?如果“是”,在什么情况下使用一种而不是另一种更好? 你不能使用其中一个或另一个。您不能在 spark 环境中使用 dplyr::copy_to除非您将数据帧从 RDD 收集到 R 数据帧。反之亦然 sparklyr 那么如果有两个dataframe,我想复制到spark环境,那它们之间绝对没有区别?我期望的东西是:sparklyr 版本更有效,或者以这种方式...... 如果您的数据框足够小,可以在本地处理(或不分发),那么dplyr 会更有效率。 Spark 的问题在于,如果您的数据集足够大,可以在分布式环境中进行分析,那么它的效率会更高。因此,如果您尝试对小型数据集进行任何类型的分析,那么在本地使用 dplyr 或任何其他 R 按照惯例在本地进行分析会更有效 【参考方案1】:

它们是一样的。我会使用copy_to 而不是专家sdf_copy_to,因为它与其他数据源更一致,但这是风格。

函数copy_todplyr 的泛型,适用于任何实现dplyr 后端的数据源。

您可以将它与火花连接一起使用,因为sparklyr 实现了copy_to.src_sparkcopy_to.spark_connection。它们不会暴露给用户,因为您应该使用 copy_to 并让它分派到正确的方法。

copy_to.src_sparck 只是调用copy_to.spark_connection:

#> sparklyr:::copy_to.src_spark
function (dest, df, name, overwrite, ...) 

    copy_to(spark_connection(dest), df, name, ...)

<bytecode: 0x5646b227a9d0>
<environment: namespace:sparklyr>

copy_to.spark_connection 只是调用sdf_copy_to

#> sparklyr:::copy_to.spark_connection
function (dest, df, name = spark_table_name(substitute(df)), 
    overwrite = FALSE, memory = TRUE, repartition = 0L, ...) 

    sdf_copy_to(dest, df, name, memory, repartition, overwrite, 
        ...)

<bytecode: 0x5646b21ef120>
<environment: namespace:sparklyr>

sdf_copy_to 遵循包范围的约定,即在与 Spark DataFrames 相关的函数前加上 "sdf_" 前缀。另一方面,copy_to 来自dplyrsparklyr 提供了兼容的方法,方便dplyr 用户使用。

【讨论】:

以上是关于dplyr::copy_to 和 sparklyr::sdf_copy_to 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

同时使用 SparkR 和 Sparklyr

Sparklyr 使用 case_when 和变量

如何使用 sparklyr 过滤部分匹配

将大型数据集缓存到 spark 内存中时“超出 GC 开销限制”(通过 sparklyr 和 RStudio)

使用 sparklyr 时无法在本地 Spark 连接中加载 .csv 数据

Sparklyr:使用 group_by,然后连接组中行中的字符串