找出2个表(`tbl_spark`)是否相等而不使用sparklyr收集它们

nac*_*hti 5 r dataframe dplyr apache-spark sparklyr

考虑在spark中有2个表或表引用要比较,例如,以确保备份正常工作.是否有可能在火花中做那个遥控?因为使用将所有数据复制到R没有用collect().

library(sparklyr)
library(dplyr)
library(DBI)

##### create spark connection here
# sc <- spark_connect(<yourcodehere>)
spark_connection(sc)
spark_context(sc)

trees1_tbl <- sdf_copy_to(sc, trees, "trees1")
trees2_tbl <- sdf_copy_to(sc, trees, "trees2")
identical(trees1_tbl, trees2_tbl) # FALSE
identical(collect(trees1_tbl), collect(trees2_tbl)) # TRUE
setequal(trees1_tbl, trees2_tbl) # FALSE
setequal(collect(trees1_tbl), (trees2_tbl)) # TRUE

spark_disconnect(sc)
Run Code Online (Sandbox Code Playgroud)

会很好,如果dplyr::setequal()可以直接使用.

zer*_*323 1

这是行不通的。这里要记住的要点是 Spark DataFrames* 不是数据容器。一旦执行管道,就会对数据应用转换的描述。这意味着,每次评估数据时结果都可能不同。您在这里可以问的唯一有意义的问题是两者是否DataFrames描述相同的执行计划,这显然对您的情况没有用。

\n\n

那么如何比较数据呢?这里确实没有普遍的答案。

\n\n

测试

\n\n

如果它是单元测试的一部分,则收集数据并比较本地对象是可行的方法(尽管请记住,使用集合可能会错过一些微妙但常见的问题)。

\n\n

生产

\n\n

外部单元测试你可以尝试检查是否

\n\n
    \n
  • A 的尺寸等于 B 的尺寸
  • \n
  • A 除外 B 是 \xe2\x88\x85 并且 B 除外 A 是 \xe2\x88\x85
  • \n
\n\n

然而,这是非常昂贵的,并且如果可行的话可能会显着增加该过程的成本。因此,在实践中,您可能更喜欢不提供严格保证但具有更好性能的方法。这些将根据输入和输出源以及故障模型而有所不同(例如,基于文件的源比使用数据库或消息队列的源更可靠)。

\n\n

在最简单的情况下,您可以使用 Spark Web UI 手动检查基本不变量,例如读取和写入的行数。对于更高级的监控,您可以实现自己的 Spark 侦听器(例如Spark:如何获取写入的行数?)、查询侦听器或累加器,但所有这些组件都不会在sparklyr并且需要编写本机(Scala 或Java)代码。

\n\n
\n\n

* 我在这里指的是 Spark,但是使用dplyr与数据库后端一起使用并没有那么不同。

\n