通过加入多个 DataFrame 来连接列
Posted
技术标签:
【中文标题】通过加入多个 DataFrame 来连接列【英文标题】:concat columns by joining multiple DataFrames 【发布时间】:2017-06-20 16:36:07 【问题描述】:我有多个数据框,我需要连接地址和基于 zip 的条件。实际上,我有 sql 查询,我需要将其转换为数据框连接 我编写了 UDF,它可以很好地连接多列以获得单列,
val getConcatenated = udf( (first: String, second: String,third: String,fourth: String,five: String,six: String) => first + "," + second + "," +third + "," +fourth + "," +five + "," +six )
mysql 查询
select
CONCAT(al.Address1,',',al.Address2,',',al.Zip) AS AtAddress,
CONCAT(rl.Address1,',',rl.Address2,',',rl.Zip) AS RtAddress,
CONCAT(d.Address1,',',d.Address2,','d.Zip) AS DAddress,
CONCAT(s.Address1,',',s.Address2,',',s.Zip) AS SAGddress,
CONCAT(vl.Address1,',',vl.Address2,',vl.Zip) AS VAddress,
CONCAT(sg.Address1,',',sg.Address2,',sg.Zip) AS SAGGddress
FROM
si s inner join
at a on s.cid = a.cid and s.cid =a.cid
inner join De d on s.cid = d.cid AND d.aid = a.aid
inner join SGrpM sgm on s.cid = sgm.cid and s.sid =sgm.sid and sgm.status=1
inner join SeG sg on sgm.cid =sg.cid and sgm.gid =sg.gid
inner join bd bu on s.cid = bu.cid and s.sid =bu.sid
inner join locas al on a.ALId = al.lid
inner join locas rl on a.RLId = rl.lid
inner join locas vl on a.VLId = vl.lid
我在加入数据框时遇到了问题,这给了我空值。
val DS = DS_SI.join(at,Seq("cid","sid"),"inner").join(DS_DE,Seq("cid","aid"),"inner") .join(DS_SGrpM,Seq("cid","sid"),"inner").join(DS_SG,Seq("cid","gid"),"inner") .join(at,Seq("cid","sid"),"inner")
.join(DS_BD,Seq("cid","sid"),"inner").join(DS_LOCAS("ALId") <=> DS_LOCATION("lid") && at("RLId") <=> DS_LOCAS("lid")&& at("VLId") <=> DS_LOCAS("lid"),"inner")
我正在尝试像上面那样加入我的数据帧,但它没有给出正确的结果,然后我想通过添加列来连接 .withColumn("AtAddress",getConcatenated()) .withColumn("RtAddress",getConcatenated())....
任何人都告诉我我们可以如何有效地实现这一点,我是正确加入数据框还是为此提供更好的方法.....
【问题讨论】:
@mrsrinivas 我尝试使用 UDF 和 concat 函数..它返回空值...你能看看我的加入是否正确,因为位置加入我很困惑......而且如果我第一次加入位置,它给了我值,那么我的问题是第二个 concat 返回空值a Yes MySQL 返回正确结果 在数据框的locas al on a.ALId = al.lid
中实现上述 SQL 连接时,我有一个疑问,如何选择 CONCAT(al.Address1,',',al.Address2,',',al.Zip) AS AtAddress
假设说我的.join(DS_LOCAS,DS_LOCAS("ALId") <=> DS_LOCATION("lid")).Select(.???..).
。如何在我们执行 a1 的 SQL 中选择特定连接的地址, r1... 在数据框中?
【参考方案1】:
您可以使用concat_ws(separator, columns_to_concat)。
示例:
import org.apache.spark.sql.functions._
df.withColumn("title", concat_ws(", ", DS_DE("Address2"), DS_DE("Address2"), DS_DE("Zip")))
【讨论】:
@Anji 如果提供的解决方案回答了您的问题,请接受它,否则请评论为什么它没有帮助您。我还注意到您有许多未决的问题,请也查看它们!以上是关于通过加入多个 DataFrame 来连接列的主要内容,如果未能解决你的问题,请参考以下文章
R语言merge函数连接多个dataframe数据集迭代内连接dataframe数据( iteratively merge data frames in R)默认merge函数通过公共列名合并数据
如何将一个 DataFrame 中的多个列与另一个 DataFrame 连接