【发布时间】:2017-12-22 08:04:42
【问题描述】:
我是 spark 的新手,上周问了一个类似的问题。它编译但不工作。所以我真的不知道该怎么办。这是我的问题:我的表 A 包含 3 列,如下所示
-----------
A1 A1 A3
-----------
a b c
和另一个像这样的表 B
------------------------------------
B1 B2 B3 B4 B5 B6 B7 B8 B9
------------------------------------
1 a 3 4 5 b 7 8 c
我的逻辑是:A1 A2 A3 是我的键,它对应于表 B 中的 B2 B6 B9。我需要构建一个以 A1 A2 A3 为键并返回 B8 的查找函数。
这是我上周尝试的:
//getting the data in to dataframe
val clsrowRDD = clsfile.map(_.split("\t")).map(p => Row(p(0),p(1),p(2),p(3),p(4),p(5),p(6),p(7),p(8)))
val clsDataFrame = sqlContext.createDataFrame(clsrowRDD, clsschema)
//mapping the three key with the value
val smallRdd = clsDataFrame.rdd.map{row: Row => (mutable.WrappedArray.make[String](Array(row.getString(1), row.getString(5), row.getString(8))), row.getString(7))}
val lookupMap:Map[mutable.WrappedArray[String], String] = smallRdd.collectAsMap()
//build the look up function
def lookup(lookupMap: Map[mutable.WrappedArray[String],String]) =
udf((input: mutable.WrappedArray[String]) => lookupMap.lift(input))
//call the function
val combinedDF = mstrDataFrame.withColumn("ENTP_CLS_CD",lookup(lookupMap)($"SRC_SYS_CD",$"ORG_ID",$"ORG_CD"))
这段代码可以编译,但并没有真正返回我需要的结果。我在想这是因为我传入了一个数组作为键,而我的表中并没有真正的数组。但是当我尝试将地图类型更改为Map[(String,String,String),String]时,我不知道你是如何在函数中传递它的。
非常感谢。
【问题讨论】:
标签: sql scala hadoop apache-spark