Ice*_*Man 5 scala dataframe apache-spark apache-spark-sql
我正在改装一些现有代码以使用Spark。我有多个保存不同数据集的数据框。在转换主数据框(或主数据集)时,我需要使用其他数据框中的数据来完成转换。我还遇到了一种情况(至少在当前结构中),我需要在另一个数据帧的转换函数中创建新的数据帧。
我正在尝试确定以下内容:
指出如何处理这种情况的指针将非常有帮助。
这两个问题的答案是否定的:
DataFrame是分布式集合的驱动程序端抽象。它们不能在任何执行者端转换中使用,创建或引用。
为什么呢 DataFrame(如RDD和Datasets)只能在活动对象的上下文中使用SparkSession-没有它,DataFrame不能“指向”活动执行者上的分区。本SparkSession应被看作是一个活的“连接”执行人的集群。
现在,如果尝试在另一个转换中使用DataFrame,则该DataFrame必须在驱动程序端进行序列化,发送给执行程序,然后在此处反序列化。但是这个反序列化的实例(在单独的JVM中)肯定会丢失它SparkSession-“连接”是从驱动程序到执行程序的,而不是我们现在正在使用的新执行程序的。
那你该怎么办?您可以通过几种方法来引用一个DataFrame的数据,而选择正确的数据主要取决于必须改组(或-在执行程序之间传输)的数据量:
收集一个DataFrame(如果可以保证很小的话!),然后spark.broadcast在任何转换中使用生成的本地集合(直接使用或使用)。
加入了一些常见的领域两个DataFrames。这是一个非常常见的解决方案,因为在转换另一个数据框时使用一个DataFrame的数据的逻辑通常与基于列的某些子集的某种“查找”以获取正确的值有关。这个用例很自然地转换为JOIN操作
使用集合运算符一样except,intersect而且union,如果他们提供的逻辑运算你之后。
| 归档时间: |
|
| 查看次数: |
982 次 |
| 最近记录: |