как обновить значения столбца dataFrame в spark - PullRequest
1 голос
/ 05 ноября 2019

У меня есть фрейм данных, который содержит аббревиатуру названия стран:

+--+----+
|Id|Code|
+--+----+
|1 |FR  |
|2 |FR  |
|3 |FR  |
|4 |Es  |
|5 |Es  |
|6 |Es  |
|7 |IT  |
+--+----+

Также у меня есть перечисление, содержащее название страны и его сокращение:

object Countries extends Enumeration {
    type Countries=Mapping
    case class Mapping(abr:String,value:String) extends Val
    val FR=Mapping("FR","France")
    val ES=Mapping("ES","Spain")
    val IT=Mapping("IT","ITALY")
}

поэтому я хочу сопоставить каждую аббревиатуру с соответствующим именем, я знаю, что я мог бы использовать функцию когда , но мне интересно, есть ли лучший способ, например, функция карты (которая отображает каждую строку сдругой)

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

На мой взгляд, самый простой способ - создать фрейм данных для карты, а затем выполнить объединение двух таблиц.

0 голосов
/ 06 ноября 2019

Вы можете создать карту сопоставлений scala следующим образом:

object Countries extends Enumeration {
    type Countries=Mapping
    case class Mapping(abr:String,value:String) extends Val
    val FR=Mapping("FR","France")
    val ES=Mapping("ES","Spain")
    val IT=Mapping("IT","ITALY")
    val map: Map[String, String] = List(FR, ES, IT).map(mapping => (mapping.abr -> mapping.value)).toMap
  }

Теперь map содержит необходимые сопоставления. Следующее, что нужно сделать, - это перебрать кадр данных, и мы можем использовать созданную нами карту, чтобы получить название страны, используя код страны:

object Application extends App {
  //create spark session and dataframe here

  val countryMapping = Countries.map
  val dataSet = df.as[(String, String)] //convert to dataSet for iteration with type safety
  val resultDS = dataSet.map{ case (id, code) => (id, countryMapping.get(code))}
  val resultDF = resultDS.toDF("Id", "Country") //convert back to dataframe

  resultDF.show
}
...