2016-10-03 2 views
2

Я хочу объединить несколько DataFrames с несколькими столбцами. Предположим,Объединить два кадра данных с несколькими разными столбцами

DataFrame А имеет 3 колонки: Column_1 Column_2 Колонка 3

DataFrame B имеет 3 колонки: Column_1 Columns_2 Column_4

DataFrame C имеет 3 колонки: Column_1 Column_2 Column_5

Я хочу, чтобы слияние этих DataFrames таким образом, что я получаю DataFrame как:

Column_1 Column_2 Column_3 Column_4 Column_5

Число DataFrames может увеличиться. Есть ли способ получить это слияние? так что для конкретной комбинации Column_1 Column_2 я получаю значения для других трех столбцов в той же строке, и если для конкретной комбинации Column_1 Column_2 в некоторых столбцах нет данных, тогда она должна показывать нуль.

DataFrame A:

Column_1 Column_2 Column_3 
    1  x  abc 
    2  y  def 

DataFrame B:

Column_1 Column_2 Column_4 
    1  x  xyz 
    2  y  www 
    3  z  sdf 

слияние А и В:

Column_1 Column_2 Column_3 Column_4 
    1  x  abc  xyz 
    2  y  def  www 
    3  z  null sdf 
+0

Я не уверен, что я получаю свой вопрос. Вы хотите привести пример ввода и вывода? – eliasah

+0

@eliasah Добавлен пример. –

ответ

5

Если я правильно понимаю ваш вопрос, вы будете нуждаться в для выполнения внешнего соединения с использованием последовательности столбцов в виде ключей.

Я использовал данные, представленные в вашем вопросе, чтобы показать, как это делается на примере:

scala> val df1 = Seq((1,"x","abc"),(2,"y","def")).toDF("Column_1","Column_2","Column_3") 
// df1: org.apache.spark.sql.DataFrame = [Column_1: int, Column_2: string, Column_3: string] 

scala> val df2 = Seq((1,"x","xyz"),(2,"y","www"),(3,"z","sdf")).toDF("Column_1","Column_2","Column_4") 
// df2: org.apache.spark.sql.DataFrame = [Column_1: int, Column_2: string, Column_4: string] 

scala> val df3 = df1.join(df2, Seq("Column_1","Column_2"), "outer") 
// df3: org.apache.spark.sql.DataFrame = [Column_1: int, Column_2: string, Column_3: string, Column_4: string] 

scala> df3.show 
// +--------+--------+--------+--------+           
// |Column_1|Column_2|Column_3|Column_4| 
// +--------+--------+--------+--------+ 
// |  1|  x|  abc|  xyz| 
// |  2|  y|  def|  www| 
// |  3|  z| null|  sdf| 
// +--------+--------+--------+--------+ 

Это называется equi-join с другим DataFrame используя данные столбцы.

Он отличается от других функций соединения, столбцы объединения будут отображаться только один раз в выводе, то есть похожи на синтаксис SQL JOIN USING.

+0

Когда я запускаю тот же код, что и упомянутый вами, я получаю эту ошибку на третьем шаге: ошибка: тип несоответствия; найдено: Seq [String] требуется: org.apache.spark.sql.Column val outputdf_1 = df1.join (df2, Seq («Column_1», «Column_2»), «внешний») –

+0

, какая версия искры вы используете? – eliasah

+0

1.5 версия Я использую –

0

Первое использование следующих кодов для всех трех кадров данных, так что SQL-запросы могут быть реализованы на dataframes

DF1.createOrReplaceTempView("df1view") DF2.createOrReplaceTempView("df2view") DF3.createOrReplaceTempView("df3view")

затем использовать эту команду присоединиться к слиянию

val intermediateDF = spark.sql("SELECT a.column1, a.column2, a.column3, b.column4 FROM df1view a leftjoin df2view b on a.column1 = b.column1 and a.column2 = b.column2")

intermediateDF.createOrReplaceTempView("imDFview")

val resultDF = spark.sql("SELECT a.column1, a.column2, a.column3, a.column4, b.column5 FROM imDFview a leftjoin df3view b on a.column1 = b.column1 and a.column2 = b.column2")

этих соединений также может быть сделано вместе в одном присоединиться, и так как вы хотите, чтобы все значения column1 и COLUMN2, вы можете использовать full outer join вместо left join

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