基于连接火花创建新的二进制列

Posted

技术标签:

【中文标题】基于连接火花创建新的二进制列【英文标题】:Create new binary column based off of join in spark 【发布时间】:2018-02-27 00:02:06 【问题描述】:

我的情况是我有两个 spark 数据框,dfPopulationdfSubpopulation

dfSubpopulation 就是这样,dfPopulation 的子群。

我想要一种干净的方法来在dfPopulation 中创建一个新列,该列是dfSubpopulation 键是否在dfPopulation 键中的二进制。例如。我想要的是创建新的 DataFrame dfPopulationNew:

dfPopulation =  X  Y  key
                1  2  A
                2  2  A
                3  2  B
                4  2  C
                5  3  C

dfSubpopulation =  X  Y  key
                   1  2  A
                   3  2  B
                   4  2  C


dfPopulationNew =  X  Y  key inSubpopulation
                   1  2  A  1
                   2  2  A  0
                   3  2  B  1
                   4  2  C  1
                   5  3  C  0

我知道这可以通过一条 SQL 语句相当简单地解决,但是鉴于很多 Sparks 优化现在都使用 DataFrame 构造,我想利用它。

【问题讨论】:

DataFrames 支持连接。有一些例子in the documentation。请记住,DataFrame 现在是 Dataset[Row] 的别名。 SparkSQL 编译为与数据集操作完全相同的执行计划... 【参考方案1】:

使用 SparkSQL 与 DataFrame 操作相比,从性能角度来看应该没有区别,执行计划是相同的。也就是说,这是使用 join

的一种方法
val dfPopulationNew = dfPopulation.join(
    dfSubpopulation.withColumn("inSubpopulation", lit(1)),
    Seq("X", "Y", "key"), 
    "left_outer")
  .na.fill(0, Seq("inSubpopulation"))

【讨论】:

我猜左连接应该足够了:) @RameshMaharjan:我相信 left_oter 应该和 left here 一样。如果我错了,请纠正我:)

以上是关于基于连接火花创建新的二进制列的主要内容,如果未能解决你的问题,请参考以下文章

如何基于 data.table 中的分类变量以编程方式创建二进制列?

请教SQL的一个问题~,如何在update时向某个列的值追加字符?

将火花数据框列中的值提取到新的派生列中

火花:十进制类型未找到

如何在火花中连接多个列,同时从另一个表中连接列名(每行不同)

将多个(任意数量)火花 DataFrame 列连接成一个“|”分隔字符串