gpt4 book ai didi

scala - 在另一个数据帧的转换中创建/访问数据帧

转载 作者:行者123 更新时间:2023-12-04 18:01:44 25 4
gpt4 key购买 nike

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

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

  • 我可以在另一个数据框的转换函数中访问一个数据框吗?
  • 可以在数据帧的转换函数内的执行器上创建数据帧吗?

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

    最佳答案

    这两个问题的答案都是 :

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

    为什么 ?
    数据帧(如 RDD 和数据集)只能在事件的上下文中使用 SparkSession - 没有它,DataFrame 不能“指向”它在事件执行器上的分区; SparkSession应该被认为是与执行程序集群的实时“连接”。

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

    那你该怎么办 ?
    您有几个选项可以在另一个 DataFrame 中引用一个 DataFrame 的数据,选择正确的选项主要取决于必须混洗(或 - 在执行程序之间传输)的数据量:

  • 收藏 DataFrames 之一(如果你能保证它很小!),然后在任何转换中使用生成的本地集合(直接或使用 spark.broadcast )。
  • 加入 一些常见字段上的两个 DataFrame。这是一个非常常见的解决方案,因为在转换另一个 DataFrame 数据时使用一个 DataFrame 的数据的逻辑通常与基于列的某些子集的正确值的某种“查找”有关。这个用例很自然地转化为 JOIN 操作
  • 使用集合运算符 喜欢 except , intersectunion ,如果他们提供您所追求的逻辑操作。
  • 关于scala - 在另一个数据帧的转换中创建/访问数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46008296/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com