Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 当过滤器应用于Spark中的DF(由2个DF和x27的并集)时,它不能按预期工作_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

Apache spark 当过滤器应用于Spark中的DF(由2个DF和x27的并集)时,它不能按预期工作

Apache spark 当过滤器应用于Spark中的DF(由2个DF和x27的并集)时,它不能按预期工作,apache-spark,apache-spark-sql,spark-dataframe,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.intersec

数据帧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)
使用hashdf的
的结果是:它只给出数据帧a的结果

111 11ww11  Airtel
数据帧b的记录表单缺失,其中哈希id存在:

444 22ee11  Vodafone
不带hashdf的
的结果是:

222 null    Idea
BSNL 333    null    
null  222    Idea

在此DF中,列值与列名不同,计数为3,其中应仅为2。从数据帧开始,“a”行重复。

查看
unionByName
在获取
列时有一个小的变化

val columns = a.columns.toSet.intersect(b.columns.toSet).map(col).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)中存在重复项,则会为filter或where子句提供意外的结果。使用distinct方法消除重复项后,结果与预期一致。

它应该可以正常工作。似乎是调用unionByName方法和填充dataframe c的位置的问题。更改unionByName后,在我的示例中,结果也不正确。我怀疑有人在读下流小说。但不知道该如何处理。
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|
+---+-------+----+