最终,我的目标是迭代包含数千条记录的 Map,并将每个匹配键与具有数百列的 Dataframe 中的列名称进行比较。
我有一个包含对象子集的数据框:
val petDF = Seq(
(1, “dog”),
(2, “cat”),
(3, "horse")
).toDF(“Rank”, “Animal”, …several hundred columns)
以及具有对象超集的键/值对的映射或字典。
val lookupMap = Map (
“Rank” -> “Rating”,
“Animal” -> “Pet”,
“Human” -> “Person”,
“Neighbor” -> “Friend”
…several thousand records…
)
我需要迭代地图/字典,对于与 Dataframe 列的每次匹配,我需要根据键上是否存在匹配来重新分配 Dataframe 中的列名称。
例如,当地图的键“Animal”匹配时,则需要将 Dataframe 列名称重命名为“Pet”。然后,当地图的键“Rank”上与 Dataframe 的列名称匹配时,需要将 Dataframe 列重命名为“Rating”。但是,当Map中没有匹配的列名称时,对Dataframe不应该有影响;就像“人类”或“邻居”
我的问题是,我试图弄清楚如何迭代映射中的每个值并与数据框列的每个值进行比较。
我尝试使用Map“.contains()”的构造,但每次循环评估时“if”都是True
for ((k, v) <- lookupMap)
{ if( lookupMap.contains(“[column name]”) { [rename column]}
}
这不起作用,因为 IF 每次使用 .contains() 时都会计算为 True。 有没有更好的方法来迭代映射并与匹配列进行比较?将会有数百场比赛。
TL;DR - 我遇到的具体问题是迭代映射中的每个键并将精确值与数据帧中的匹配列进行比较。这里的任何帮助或指示都会很棒。
正如 @Luis Miguel Mejía Suárez 在评论中指出的,您可以利用
withColumnRenamed()
使用 lookupMap
重命名列,如下所示:
val currentColumns = petDF.columns
val renamedPetDF = currentColumns.foldLeft(petDF) { (df, colName) =>
lookupMap.get(colName) match {
case Some(newColName) => df.withColumnRenamed(colName, newColName)
case None => df
}
}