在Scala数据框中,在成对比较之后合并等效行

时间:2018-12-14 20:32:31

标签: scala apache-spark apache-spark-sql

我在scala中有一个数据框,它是原始数据中的所有行与其自身以及得分之间成对比较的结果。我正在寻找一种有效的方法来合并每对产生的两行(例如Value1,Value2和Value2,Value1)。

如果相关,则此数据帧是通过spark.read.table命令创建的,该命令引用包含所有这些行的表。我首先想到的是一个循环,该循环基本上建立了一个新的数据框,并检查每一行以查看是否已将这对存储在新的数据框中,但是我希望有一种更灵活的方法可以更高效地完成该操作。

理想情况下,我将查看分数范围内的值的子集,并将多行合并为“第一个”(其中“ first”可以按字母顺序第一个)。

数据

Item1     Item2     1.5
Item2     Item1     1.5
Item3     Item4     2.6
Item4     Item3     2.6
Item3     Item5     2.7
Item5     Item3     2.7

结果

Item1     Item2     1.5
Item3     Item4     2.6
Item3     Item5     2.7

2 个答案:

答案 0 :(得分:1)

这可以通过内置的leastgreatest函数来完成。此处显示的PySpark示例。

from pyspark.sql import functions as f
df.select(f.least(df.col1,df.col2).alias('i1'),
          f.greatest(df.col1,df.col2).alias('i2'),
          df.price
         ).distinct()

greatest返回所选列中的最大值,而least选择其中列的最小值。

答案 1 :(得分:0)

因此,从Vamsi的想法出发,这是scala版本(因为问题是关于scala而不是pyspark的问题)。

val df = spark.read.table("table_name")
  .withColumn("NewNameA", least('nameA, 'nameB))
  .withColumn("NewNameB", greatest('nameA,'nameB))
  .dropDuplicates("NewNameA","NewNameB")