过滤器在 Spark 中的 DF(2 个 DF 的并集)上应用时未按预期工作



数据框架A:

SN  Hash_id Name
111 11ww11  Airtel
222 null    Idea

数据框架B:

SN  Hash_id Name
333 null    BSNL
444 22ee11  Vodafone

按列名在这些数据框上执行联合列,如下:

def unionByName(a: DataFrame, b: DataFrame): DataFrame = {
    val columns = a.columns.toSet.intersect(b.columns.toSet).map(col).toSeq
    a.select(columns: _*).unionAll(b.select(columns: _*))
} 

结果是:数据帧C

SN  Hash_id Name
111 11ww11  Airtel
222 null    Idea
333 null    BSNL
444 22ee11  Vodafone

在数据框架上执行过滤器c。

val withHashDF = c.where(c("Hash_id").isNotNull)
val withoutHashDF = c.where(c("Hash_id").isNull)

withHashDF的结果是:它仅给数据框架a

给出结果
111 11ww11  Airtel

记录形式的数据框架B缺少存在哈希ID:

444 22ee11  Vodafone

withoutHashDF的结果是:

222 null    Idea
BSNL 333    null    
null  222    Idea

在此df中,列值不符合每个列名,计数为3,其中应为2。

unionByName获得columns

的变化很小

更改
val columns = a.columns.toSet.intersect(b.columns.toSet).map(col).toSeq

to

val columns = a.columns.intersect(b.columns).map(row => new Column(row)).toSeq

那么它应该按预期工作。

查看完整的代码段&下面的结果:

import sparkSession.sqlContext.implicits._
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.Column
val dataFrameA = Seq(("111", "11ww11", "Airtel"),("222", null, "Idea")).toDF("SN","Hash_id", "Name")
val dataFrameB = Seq(("333", null, "BSNL"),("444", "22ee11", "Vodafone")).toDF("SN","Hash_id", "Name")
def unionByName(a: DataFrame, b: DataFrame): DataFrame = {
  val columns = a.columns.intersect(b.columns).map(row => new Column(row)).toSeq
  a.select(columns: _*).union(b.select(columns: _*))
}
val dataFrameC = unionByName(dataFrameA, dataFrameB)
val withHashDF = dataFrameC.where(dataFrameC("Hash_id").isNotNull)
val withoutHashDF = dataFrameC.where(dataFrameC("Hash_id").isNull)
println("dataFrameC")
dataFrameC.show()
println("withHashDF")
withHashDF.show
println("withoutHashDF")
withoutHashDF.show

输出:

dataFrameC
+---+-------+--------+
| SN|Hash_id|    Name|
+---+-------+--------+
|111| 11ww11|  Airtel|
|222|   null|    Idea|
|333|   null|    BSNL|
|444| 22ee11|Vodafone|
+---+-------+--------+
withHashDF
+---+-------+--------+
| SN|Hash_id|    Name|
+---+-------+--------+
|111| 11ww11|  Airtel|
|444| 22ee11|Vodafone|
+---+-------+--------+
withoutHashDF
+---+-------+----+
| SN|Hash_id|Name|
+---+-------+----+
|222|   null|Idea|
|333|   null|BSNL|
+---+-------+----+

如果dataframe(unionall)中有重复项,则为滤波器或何处给出意外的结果。一旦您使用不同的方法消除了重复项,结果就如预期的。

相关内容

  • 没有找到相关文章

最新更新