【问题标题】:Union in Spark SQL query removing duplicates from DatasetSpark SQL 查询中的联合从数据集中删除重复项
【发布时间】:2018-03-04 12:09:42
【问题描述】:

我正在为 Apache Spark 使用 Java API,并且我有两个数据集 A 和 B。 这两者的架构是相同的:电话号码、姓名、年龄、地址

两个数据集中有一条记录以 PhoneNumber 为 common,但该记录中的其他列不同

我在这两个数据集上运行以下 SQL 查询(通过将它们注册为临时表):

A.createOrReplaceTempView("A");
B.createOrReplaceTempView("B");

String query = "Select * from A UNION Select * from B";

Dataset<Row> result = sparkSession.sql(query);
result.show();

出乎意料的是,结果只有一条具有相同PhoneNumber的记录,而另一条被删除了。

我知道 UNION 是 SQL 查询旨在删除重复,但它还需要知道主键,根据它决定什么是重复的。

此查询如何推断我的数据集的“主键”? (Spark中没有主键的概念)

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    您可以使用UNION ALL

    Seq((1L, "foo")).toDF.createOrReplaceTempView("a")
    Seq((1L, "bar"), (1L, "foo")).toDF.createOrReplaceTempView("b")
    
    spark.sql("SELECT * FROM a UNION ALL SELECT * FROM b").explain
    
    == Physical Plan ==
    Union
    :- LocalTableScan [_1#152L, _2#153]
    +- LocalTableScan [_1#170L, _2#171]
    

    Dataset.union方法:

    spark.table("a").union(spark.table("b")).explain
    
    == Physical Plan ==
    Union
    :- LocalTableScan [_1#152L, _2#153]
    +- LocalTableScan [_1#170L, _2#171]
    

    此查询如何推断我的数据集的“主键”?

    我没有,或者至少在当前版本中没有。它只是使用所有可用列应用HashAggregate

    spark.sql("SELECT * FROM a UNION SELECT * FROM b").explain
    
    == Physical Plan ==
    *HashAggregate(keys=[_1#152L, _2#153], functions=[])
    +- Exchange hashpartitioning(_1#152L, _2#153, 200)
       +- *HashAggregate(keys=[_1#152L, _2#153], functions=[])
          +- Union
             :- LocalTableScan [_1#152L, _2#153]
             +- LocalTableScan [_1#170L, _2#171]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-03
      • 2019-06-11
      • 2018-12-06
      • 2012-09-06
      • 2018-10-26
      • 2019-03-19
      • 2019-12-11
      • 1970-01-01
      相关资源
      最近更新 更多