2017-02-03 7 views
0

У меня есть несколько фреймов данных. Мне нужно конкретизировать адреса и условия на основе zip. Фактически у меня был sql-запрос, который мне нужно преобразовать в соединение dataframe. Я написал UDF, который отлично работает для объединения нескольких столбцов чтобы получить один столбец,concat columns, объединив несколько DataFrames

val getConcatenated = udf((first: String, second: String,third: String,fourth: String,five: String,six: String) => { first + "," + second + "," +third + "," +fourth + "," +five + "," +six }) 

MySQL Query

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 

я обращенный вопрос при вступлении в dataframes, который дает мне нулевое значение.

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 пытается присоединиться к моим dataFrames, как и выше, не давая быть правильные результаты, а затем я хочу Concat, добавив столбец .withColumn ("AtAddress", getConcatenated()) .withColumn ("RtAddress », getConcatenated()) ....

Любой один скажите мне, насколько эффективно мы можем достичь этого и я присоединившись к dataframes правильно или лучше подходят для этого .....

+0

@mrsrinivas Я попытался с UDF, а также CONCAT function..It возвращает меня нулевые значения ... Вы можете посмотреть на мои присоединиться те, это правильный путь, потому что места присоединиться I я запутался ... И если в первый раз я присоединяюсь к локациям, они дают мне значения, то моя проблема связана со вторым concat, возвращающим значение nulla – Anji

+0

Да MySQL возвращает правильный результат – Anji

+0

У меня возникло сомнение при реализации выше SQL-соединения в dataframe 'locas al on a.ALId = al.lid' как выбрать' CONCAT (al.Address1, ',', al.Address2, ',', al.Zip) AS AtAddress' предположите, что мой '.join (DS_LOCAS , DS_LOCA S («ALId») <=> DS_LOCATION («крышка»)). Выберите (. .. ..)............................. – Anji

ответ

0

Вы можете использовать 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"))) 
+1

@Anji Если предоставленное решение отвечает на ваш вопрос, пожалуйста, примите его, иначе прокомментируйте, почему это вам не помогло. Я также заметил, что у вас есть много ожидающих вопросов, пожалуйста, просмотрите их также! – eliasah

Смежные вопросы