如何使用Scala的DataFrame比较表中的每一列而不关心列是啥? [重复]
Posted
技术标签:
【中文标题】如何使用Scala的DataFrame比较表中的每一列而不关心列是啥? [重复]【英文标题】:How do I compare each column in a table using DataFrame by Scala without caring what the column is? [duplicate]如何使用Scala的DataFrame比较表中的每一列而不关心列是什么? [重复] 【发布时间】:2017-06-20 12:55:36 【问题描述】:我之前问的问题如下。 Last question
表1——ID对表
表2——属性表
表 3
例如id1和id2有不同的颜色和大小,所以id1和id2行(表3中的第2行)有“id1 id2 0 0”;
id1和id3颜色相同,大小不同,所以id1和id3行(表3第3行)有“id1 id3 1 0”;
相同的属性---1 不同的属性---0
但是,如果我不知道 Table2 中有多少个属性列怎么办;我怎样才能做到?比如我不知道列名颜色或大小。也许还有另一列叫做品牌。那怎么才能拿到Table3呢?
【问题讨论】:
那么您想要包含哪些列 - 除了id
列之外的所有“table2”列?
你不应该编辑你原来的问题吗:***.com/questions/44582222/…
Tom Lous,谢谢你提醒我。下次我会注意的。
【参考方案1】:
以下解决方案应该适用于Table2
中任何未知数量的属性。我已经编辑了您Last Question的答案
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 |
+----+----+-----+----+-----+
该解决方案应该适用于任何未知数量的属性。
【讨论】:
太棒了!新手总是被一个简单的问题卡住很长时间。非常感谢! 新手经验不足,但很快他们就会:)。我以前也和你一样。感谢您的接受和点赞。 :) 嗨,拉梅什。你最初是如何学习 scala 和 spark 的?除了官网还有什么好材料推荐给我的吗? 我还没学。这就是我的感觉。您可以加入 coursera 免费课程,在 scala 中进行函数式编程。这很有帮助。 :) 是的,绝对是 :) Programming in Scala 和 gumroad.com/l/AtomicScala以上是关于如何使用Scala的DataFrame比较表中的每一列而不关心列是啥? [重复]的主要内容,如果未能解决你的问题,请参考以下文章
将一个 pandas DataFrame 的副本合并到另一个 DataFrame 的每一行中?
如何在 Databricks 的 PySpark 中使用在 Scala 中创建的 DataFrame