我在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
答案 0 :(得分:1)
这可以通过内置的least
和greatest
函数来完成。此处显示的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")