当它应用于Spark

时间:2017-02-24 05:20:38

标签: apache-spark apache-spark-sql spark-dataframe

数据框a:

SN  Hash_id Name
111 11ww11  Airtel
222 null    Idea

数据框b:

SN  Hash_id Name
333 null    BSNL
444 22ee11  Vodafone

按列名称对这些数据框执行UnionAll,如下所示:

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

在存在哈希id的地方缺少数据框b的记录:

444 22ee11  Vodafone

withoutHashDF的结果是:

222 null    Idea
BSNL 333    null    
null  222    Idea

在此DF中,列值不是按列名称计算,计数是3,它应该只有2.从数据框“a”行重复。

1 个答案:

答案 0 :(得分:0)

如果Dataframe(Unionall)中存在重复项,则会为filter或where子句提供意外结果。一旦通过使用distinct方法消除重复项,结果就像预期的那样。