2017-02-03 7 views
0

私は複数のデータフレームを持っています。私はアドレスとzipベースの条件をconcatする必要があります。実際に私はデータフレームに変換する必要があるSQLクエリを持っていました 私は複数の列単一の列を取得するために、複数のDataFramesを結合してconcatカラム

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 

私にNULL値を与えるデータフレームを結合するとき、私は問題に直面しています。適切な結果も与えた後、私は列 .withColumn追加することにより、CONCATたい(「AtAddressを」、getConcatenated()) .withColumn(「RtAddressされていない上のように私のデータフレームに参加しようと

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") 

Iamは」、getConcatenated())....

いずれかが、我々はこれを達成することができますどのように効果的に教えてください、私は正確にデータフレームに参加したり、このための任意のより良いアプローチしています.....

+0

@mrsrinivasは...あなたは私のものに参加するに見ることができる場所が私に参加するためには、正しい方法であります混乱しています...そして、初めて私が場所に参加した場合、値が与えられてから、問題が2番目のconcatでNULL値を返しています – Anji

+0

はいMySQLは正しい結果を返します – Anji

+0

上記のSQLを実装する際に疑問がありましたデータフレームの 'loca al on a.ALId = al.lid'' CONCAT(al.Address1、 '、' al.Address2、 '、al.Zip)を選択する方法At AtAddressは私の '.join(DS_LOCAS 、DS_LOCA SQLで特定の結合のアドレスを選択するには、a1。、r1 ...データフレーム内で? – Anji

答えて

0

あなたはconcat_ws(separator, columns_to_concat)を使用することができます。

例:私はUDFと試みたともfunction..Itは私にNULL値を返しているCONCAT

import org.apache.spark.sql.functions._ 
df.withColumn("title", concat_ws(", ", DS_DE("Address2"), DS_DE("Address2"), DS_DE("Zip"))) 
+1

@Anji提供されたソリューションがあなたの質問に答えた場合は、それがなぜあなたに役立たなかったのかをコメントしてください。私はあなたも多くの懸案事項があることに気づきました。 – eliasah

関連する問題