我有一个名为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用于类似的映射
答案 0 :(得分:1)
您可以将模式匹配用于地图功能,并将udf.apply用于地图功能,例如:
def fromToValue(zipDictionary: Map[String, String]): String => String = zip =>
zipDictionary.getOrElse(zip, "Region Unknown")
如果您知道一些特定情况,可以通过以下方式处理:
{{1}}
如果您不了解案例,则可以简单地使用getOrElse方法:
{{1}}