如何在不关心列是什么的情况下使用 Scala 的 DataFrame 比较 table 中的每一列?
How do I compare each column in a table using DataFrame by Scala without caring what the column is?
我之前问的问题如下。
Table 1 -- ID 对 table
Table 2 -- 属性 table
Table 3
例如,id1和id2的颜色和大小不同,所以id1和id2行(Table 3中的第2行)有"id1 id2 0 0";
id1 和 id3 颜色相同但大小不同,所以 id1 和 id3 行(Table 3 中的第 3 行)有 "id1 id3 1 0";
相同属性---1 不同属性---0
但是,如果我不知道Table2中有多少个属性列怎么办?我怎样才能做到?比如我不知道列名颜色或尺寸。也许还有另一个名为品牌的专栏。那我怎么才能得到Table3?
以下解决方案适用于 Table2
中任何未知数量的属性。我已经编辑了您
的答案
val t1 = List(
("id1","id2"),
("id1","id3"),
("id2","id3")
).toDF("id_x", "id_y")
val t2 = List(
("id1","blue","m","brand1"),
("id2","red","s","brand1"),
("id3","blue","s","brand2")
).toDF("id", "color", "size", "brand")
val outSchema = t2.columns.tail
var t3 = t1
.join(t2.as("x"), $"id_x" === $"x.id", "inner")
.join(t2.as("y"), $"id_y" === $"y.id", "inner")
for(columnName <- outSchema){
t3 = t3.withColumn(columnName+"s", when(col(s"x.$columnName") === col(s"y.$columnName"),1).otherwise(0))
.drop(columnName)
.drop("id")
.withColumnRenamed(columnName+"s", columnName)
}
t3.show(false)
最终输出为
+----+----+-----+----+-----+
|id_x|id_y|color|size|brand|
+----+----+-----+----+-----+
|id1 |id2 |0 |0 |1 |
|id1 |id3 |1 |0 |0 |
|id2 |id3 |0 |1 |0 |
+----+----+-----+----+-----+
该解决方案应该适用于任何未知数量的属性。
我之前问的问题如下。
Table 1 -- ID 对 table
Table 2 -- 属性 table
Table 3
例如,id1和id2的颜色和大小不同,所以id1和id2行(Table 3中的第2行)有"id1 id2 0 0";
id1 和 id3 颜色相同但大小不同,所以 id1 和 id3 行(Table 3 中的第 3 行)有 "id1 id3 1 0";
相同属性---1 不同属性---0
但是,如果我不知道Table2中有多少个属性列怎么办?我怎样才能做到?比如我不知道列名颜色或尺寸。也许还有另一个名为品牌的专栏。那我怎么才能得到Table3?
以下解决方案适用于 Table2
中任何未知数量的属性。我已经编辑了您
val t1 = List(
("id1","id2"),
("id1","id3"),
("id2","id3")
).toDF("id_x", "id_y")
val t2 = List(
("id1","blue","m","brand1"),
("id2","red","s","brand1"),
("id3","blue","s","brand2")
).toDF("id", "color", "size", "brand")
val outSchema = t2.columns.tail
var t3 = t1
.join(t2.as("x"), $"id_x" === $"x.id", "inner")
.join(t2.as("y"), $"id_y" === $"y.id", "inner")
for(columnName <- outSchema){
t3 = t3.withColumn(columnName+"s", when(col(s"x.$columnName") === col(s"y.$columnName"),1).otherwise(0))
.drop(columnName)
.drop("id")
.withColumnRenamed(columnName+"s", columnName)
}
t3.show(false)
最终输出为
+----+----+-----+----+-----+
|id_x|id_y|color|size|brand|
+----+----+-----+----+-----+
|id1 |id2 |0 |0 |1 |
|id1 |id3 |1 |0 |0 |
|id2 |id3 |0 |1 |0 |
+----+----+-----+----+-----+
该解决方案应该适用于任何未知数量的属性。