在另一个数据框的转换中创建/访问数据框



我正在修改一些现有的代码以使用Spark。我有多个保存不同数据集的数据帧。在转换主要数据帧(或主要数据集)的同时,我需要使用来自其他数据框架的数据来完成转换。我也有一个情况(在当前结构中至少),我需要在另一个数据帧的转换功能中创建新的数据帧。

我正在尝试确定以下内容:

  1. 我可以在另一个数据框架的转换功能中访问数据框架吗?
  2. 可以在dataframe的转换函数内部的执行器上创建数据框吗?

关于如何处理这种情况的指示将非常有帮助。

两个问题的答案是 no

数据框是分布式集合的驱动程序端抽象。它们在任何执行者端转换中都无法使用,创建或引用。

为什么?DataFrames(例如RDD和数据集)只能在活动SparkSession的上下文中使用 - 如果没有它,数据框就无法"指向"其在活动执行者上的分区;SparkSession应该被认为是与执行者群体的实时"连接"。

现在,如果您尝试在另一个转换中使用数据帧,则该数据框必须在驱动程序端进行序列化,发送给执行者,然后发送给eperation delemialized 在那里。但是,此必不可少的实例(在单独的JVM中)必然会丢失其SparkSession-"连接"是从驱动程序到执行人的,而不是我们现在正在运行的新执行程序。

那么您该怎么办?您有几个选项可以在另一个数据范围的 data 中引用另一个数据框,而选择正确的数据主要取决于必须改组的数据量(或在执行者之间转移):

  1. 收集 dataFrames之一(如果可以保证它很小!),然后在任何转换中使用所得的本地集合(直接或使用spark.broadcast)。

  2. JOIN 在某些公共字段上的两个数据范围。这是一个非常普遍的解决方案,因为在转换另一个数据框时使用一个数据框的数据通常与基于列的某些子集的某种"查找"有关。该用户酶转化为联接操作,自然

  3. 使用集合操作员例如exceptintersectunion,如果它们提供了您所追求的逻辑操作。

相关内容

  • 没有找到相关文章

最新更新