import org.apache.spark.sql.expressions.Window
val df1 = Seq((23,89)).toDF("col1","col2")
val df2 = Seq((57,72)).toDF("col1","col2")
val windowSpec = Window.partitionBy(lit("A")).orderBy(lit("A"))
val df3=df1.withColumn("id",row_number.over(windowSpec))
val df4=df2.withColumn("id",row_number.over(windowSpec))
df3.createOrReplaceTempView("df3")
df4.createOrReplaceTempView("df4")
spark.sql("SELECT a.col1-b.col1 as col1,a.col2-b.col2 as col2 FROM df4 a INNER JOIN df3 b ON a.id=b.id").show()
/*
+----+----+
|col1|col2|
+----+----+
| 34| -17|
+----+----+
* /
3条答案
按热度按时间cl25kdpy1#
此版本对df中不同数量的列执行此操作。只是需要更新一下
val n
到df中的列数。它回答发问者提出的不属于原始问题的后续问题。
退货:
x4shl7ld2#
另一个更难的方法,但可能是更好的性能明智和严格地说是正确的。显示了df api中常见名称的一些问题。
zipwithindex方法保留了顺序。
重点仍然是,如果成百上千的col呢?
附录
对于许多列,是一个开始,而不是答案的一部分:
对带lit&SUBTERATION和rowid DROPTION的_1和_2列应用适当的函数。值得深思的好例子。
nvbavucw3#
下面的代码可能会有所帮助,