我正在改装一些现有代码以使用Spark。我有多个包含不同数据集的数据帧。在转换主数据帧(或主数据集)时,我需要使用来自其他数据帧的数据来完成转换。我还有一种情况(至少在当前结构中),我需要在另一个数据帧的转换函数中创建新的数据帧。
我试图确定以下内容:
关于如何处理这种情况的指针将非常有帮助。
这两个问题的答案都是否定的:
数据帧是分布式集合的驱动端抽象。它们不能在任何执行器端转换中使用、创建或引用。
为什么啊?DataFrames(如RDD和Datasets)只能在活动的Sparksession
上下文中使用-没有它,DataFrame不能指向活动执行程序上的分区;应该将Sparksession
视为活动连接”到了执行人集群。
现在,如果您尝试在另一个转换中使用数据帧,那么该数据帧必须在驱动端序列化,发送到执行器,然后在那里反序列化。但是这个反序列化的实例(在一个单独的JVM中)必然会丢失它的SparkSession
——这个“连接”是从驱动程序到执行器的,而不是从我们现在操作的这个新执行器。
那么你该怎么做呢?您有几个选项来引用另一个数据帧的数据,选择正确的数据主要取决于必须洗牌(或在执行程序之间传输)的数据量:
>
收集其中一个数据帧(如果你能保证它很小的话!),然后在任何转换中使用生成的本地集合(直接或使用spark.broadcast
)。
在一些公共字段上连接两个数据帧。这是一种非常常见的解决方案,因为在转换另一个数据帧时使用一个数据帧的数据的逻辑通常与基于某个列子集的正确值的某种“查找”有关。这个用例相当自然地转化为连接操作
使用集合运算符,如except
、intersect
和union
,如果它们提供了您所追求的逻辑运算。
我得到了一个具有多个列和行的数据帧df1。简单的例子: 我想创建一个空的数据框df2,然后再添加新的列和计算结果。 此时,我的代码如下所示: …添加两个新列: 有没有更好/更安全/更快的方法?是否可以创建一个空数据帧df2,并且只从df1复制索引?
在R中,我有以下两个数据帧(Df1和Df2)——它们是我刚刚制作的例子——我打算根据以下规则创建一个虚拟变量:对于Df1中的每个id,如果这个观察id的年份更高或等于Df2中年份的观测id,则虚拟值为1,否则为0。数据帧Df3是我希望实现的结果。我怎么能做到呢?Df1 Df2 Df3 一些背景: 我尝试为我正在处理的真实数据帧创建两个循环。下面是我尝试过的代码。数据帧称为data_school,我
我有两个数据框,都包含英文和中文单词字符串,我想知道其中一个是另一个的子集:
我有两个数据帧,它们的列名相同,但行数不同。第一个数据帧(a)看起来与此类似: 注:站点5、6、8和12故意丢失。 第二个数据帧(b)看起来像这样: 我想要实现的是: 在那里我注入(我肯定有一个更好的术语)数据帧b到数据帧a的数据,但是我想用零替换b中的任何NAs,并保持a中的NAs不变。 我发现并尝试了这个代码: 但它会带来NAs。我考虑先将NAs替换为零,但即使如此,它也会抹去我目前在数据帧a
我和Spark一起在Databricks上工作。编程语言是Scala。 我有两个数据帧: 主数据框:见截图:1 查找数据帧:参见屏幕截图3 我想: 查找主数据框中“年龄”=-1的所有行 我对如何做这件事伤了脑筋。我唯一想到的是将dataframe存储为DataRicks中的表,并使用SQL语句(SQL.Context.SQL…),结果非常复杂。 我想知道是否有更有效的方法。 编辑:添加可复制的示例
我有一个关于熊猫以及正确索引和替换值的问题。 我有两个数据帧,df1和df2,具有相同的列(Col1、Col2、Col3和Col4)。 在df1中,我想用另一个值(比如100)替换与df2中其他列(Col1、Col2和Col3)的值匹配的行中Col4中的值。 生成的df1看起来像这样: 我试过这样的方法: 但是我得到了错误,我不确定这是否达到了我想要的。