根据CSV映射将新列添加到数据框(通用方法)

时间:2020-01-02 16:31:41

标签: scala dataframe mapping

我有一个名为zip.csv的映射文件,我想使用该文件根据现有列在Spark数据框中创建新列。 这就是我的映射csv的样子

zip,area
ABC,Region 1
DEF,Region 2
OGE,Region 3
GRE,Region 3

我想将此映射应用于看起来像这样的新数据文件

zip,name,age
ABC,ERIK,23
DEF,JAN,44
OGE,OLE,21
GRE,EILI,26
ABC,EILI,33

对此应用映射将返回

zip,name,age,area
ABC,ERIK,23,Region 1
DEF,JAN,44,Region 2
OGE,OLE,21,Region 3
GRE,EILI,26,Region 4
ABC,EILI,33,Region 1

此刻,我按如下操作

var fileName = "pathtofile/name.csv"
var nameDF = spark.read.format("csv")
                        .option("header", "true")
                        .option("delimiter", ",")
                        .option("mode", "DROPMALFORMED")
                        .load(fileName)  


val fromToValue = udf {(fromValue: String) => 
  if(fromValue == "ABC") "Region 1"
  else if(fromValue == "DEF") "Region 2"
  else if(fromValue == "OGE") "Region 3"
  else if(fromValue == "GRE") "Region 4"
  else "NA"
}


nameDF = nameDF.withColumn("Area", fromToValue(nameDF("zip")))
display(nameDF)

这正在工作。但是如何才能重写用户定义的fromToValue函数以使用此csv文件?

zip,area
ABC,Region 1
DEF,Region 2
OGE,Region 3
GRE,Region 3

我也想稍后将此udf用于类似的映射

1 个答案:

答案 0 :(得分:1)

您可以将模式匹配用于地图功能,并将udf.apply用于地图功能,例如:

def fromToValue(zipDictionary: Map[String, String]): String => String = zip => 
zipDictionary.getOrElse(zip, "Region Unknown")

如果您知道一些特定情况,可以通过以下方式处理:

{{1}}

如果您不了解案例,则可以简单地使用getOrElse方法:

{{1}}