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

Ice*_*Man 5 scala dataframe apache-spark apache-spark-sql

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

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

  1. 我可以在另一个数据框的转换功能内访问一个数据框吗?
  2. 是否可以在数据框的转换功能内的执行程序上创建数据框?

指出如何处理这种情况的指针将非常有帮助。

Tza*_*har 6

这两个问题的答案是否定的

DataFrame是分布式集合的驱动程序端抽象。它们不能在任何执行者端转换中使用,创建或引用。

为什么呢 DataFrame(如RDD和Datasets)只能在活动对象的上下文中使用SparkSession-没有它,DataFrame不能“指向”活动执行者上的分区。本SparkSession应被看作是一个活的“连接”执行人的集群。

现在,如果尝试在另一个转换中使用DataFrame,则该DataFrame必须在驱动程序端进行序列化,发送给执行程序,然后在此处反序列化。但是这个反序列化的实例(在单独的JVM中)肯定会丢失它SparkSession-“连接”是从驱动程序到执行程序的,而不是我们现在正在使用的新执行程序的。

那你该怎么?您可以通过几种方法来引用一个DataFrame的数据,而选择正确的数据主要取决于必须改组(或-在执行程序之间传输)的数据量:

  1. 收集一个DataFrame(如果可以保证很小的话!),然后spark.broadcast在任何转换中使用生成的本地集合(直接使用或使用)。

  2. 加入了一些常见的领域两个DataFrames。这是一个非常常见的解决方案,因为在转换另一个数据框时使用一个DataFrame的数据的逻辑通常与基于列的某些子集的某种“查找”以获取正确的值有关。这个用例很自然地转换为JOIN操作

  3. 使用集合运算符一样exceptintersect而且union,如果他们提供的逻辑运算你之后。