scala - 尝试将数据帧的每一行与另一个数据帧的某些行组合时最合适的连接类型
问题描述
我有以下情况,我以一种非常低效的方式解决了:
我有一个名为的数据框dfUniques
,其中每一行包含与其他行不同的值(例如:1K 行,但它可能更多,甚至少于 100 行)。还有一个名为 的数据框dfFull
,可以在其中的某些行中找到与 中存在的相同值dfUniques
。比dfFull
大得多dfUniques
,而且它的列数是 的 3 倍dfUniques
。我想要做的是找到所有行,dfFull
其中共同的列与其中的行dfUniques
具有相同的值。dfUniques
因为目标是计算其中有多少行dfFull
。
我实现的方式是错误的(我认为),因为它需要很多时间,而且我正在使用collect()
调用(我知道当数据变大时它不是最好的)。这是我的代码:
dfUniques.collect().foreach{
row => {
val singlerowRDD = spark.createDataFrame(spark.sparkContext.parallelize(Seq(row)), myschema)
val matching = dfFull
.join(singlerow, columnsInCommon)
.select(selColumns.head, selColumns.tail: _*)
val matchingCount = matching.count()
println("instances that matched\t" + matchingCount)
if (matchingRBCount > 0){
val dfAggr = matching.groupBy("name").avg(selColumns: _*)
resultData = resultData.union(dfAggr)
}
}
}
我认为一个好的方法应该是使用 some join
,但我找不到最适合我想做的事情。有什么建议吗?我发现了这个(https://stackoverflow.com/a/51679966/5081366),但这不适用于我的情况,因为该帖子尝试将数据帧的每一行与另一个数据帧的所有行连接起来,但我想仅获取与 的每一行匹配的行dfUniques
。好吧,我希望清楚。
解决方案
你是对的,加入是最好的方法。在您的情况下,“左半”将适用。您还可以从这里阅读各种类型的火花连接 - https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html?highlight=join#pyspark.sql.DataFrame.join
tst= sqlContext.createDataFrame([(1,2),(1,3),(9,9),(2,4),(2,10),(3,5),(10,9),(3,6),(3,8),(7,9),(4,5),(19,1),(20,4),(22,3),(30,5),(67,4)],schema=['a','b'])
tst1 = sqlContext.createDataFrame([(1,2),(2,5),(7,6)],schema=['a','c'])
tst_res= tst.join(tst1,on='a',how='left_semi')
tst_res.show()
+---+---+
| a| b|
+---+---+
| 1| 2|
| 1| 3|
| 2| 4|
| 2| 10|
| 7| 9|
+---+---+