2016-11-07 4 views
0

Как объединить данные с одним столбцом (описание) с другим фреймворком данных, имеющим 2 столбца (Name, Caption), так что мой результирующий фреймворк будет содержать 3 столбца (Name, Caption, Description)Комбинирование данных в java

+0

Я попытался присоединиться, но это приводит к декартовой присоединиться. Все имена и титры, сопоставленные ко всем описаниям –

+0

Есть ли ключ для соединения? Как вы определяете, какое описание соответствует имени? –

+0

нет ключ для присоединение. совпадения первого имени с первым описанием, второе совпадение со вторым описанием и т. д. –

ответ

0

Я предлагаю решение в scala. Теперь я могу добавить это как комментарий, но для форматирования и изображения, которое я прикрепляю, предоставляя это как ответ. Я довольно много уверен, что должен быть эквивалент в Java, а для этого

val nameCaptionDataFrame = Seq(("name1","caption1"),("name2","caption2"),("name3","caption3"),("name4","caption4")).toDF("name","caption") 
val descriptionDataFrame = List("desc1","desc2","desc3","desc4").toDF("description") 
val nameCaptionDataFrameWithId = nameCaptionDataFrame.withColumn("nameId",monotonically_increasing_id()) 
nameCaptionDataFrameWithId.show 
val descriptionDataFrameId = descriptionDataFrame.withColumn("descId",monotonically_increasing_id()) 
descriptionDataFrameId.show 
nameCaptionDataFrameWithId.join(descriptionDataFrameId, nameCaptionDataFrameWithId.col("nameId") === descriptionDataFrameId.col("descId")).show 

Вот пример вывода этой части кода. Я надеюсь, что вы будете в состоянии принять идею здесь (API, последовательны я предполагаю), и сделать это в Java

enter image description here

** правок JAVA ** «перевода» в код будет выглядеть аналогично этому.

/** 
* Created by RGOVIND on 11/8/2016. 
*/ 

import org.apache.spark.SparkConf; 
import org.apache.spark.api.java.JavaPairRDD; 
import org.apache.spark.api.java.JavaRDD; 
import org.apache.spark.api.java.JavaSparkContext; 
import org.apache.spark.api.java.function.PairFunction; 
import org.apache.spark.sql.*; 
import scala.Tuple2; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class SparkMain { 
    static public void main(String[] args) { 
     SparkConf conf = new SparkConf().setMaster("local").setAppName("Stack Overflow App"); 
     JavaSparkContext sc = new JavaSparkContext(conf); 
     SQLContext sqlContext = new SQLContext(sc); 

     List<Tuple2<String, String>> tuples = new ArrayList<Tuple2<String, String>>(); 
     tuples.add(new Tuple2<String, String>("name1", "caption1")); 
     tuples.add(new Tuple2<String, String>("name3", "caption2")); 
     tuples.add(new Tuple2<String, String>("name3", "caption3")); 

     List<String> descriptions = Arrays.asList(new String[]{"desc1" , "desc2" , "desc3"}); 

     Encoder<Tuple2<String, String>> nameCaptionEncoder = Encoders.tuple(Encoders.STRING(), Encoders.STRING()); 
     Dataset<Tuple2<String, String>> nameValueDataSet = sqlContext.createDataset(tuples, nameCaptionEncoder); 
     Dataset<String> descriptionDataSet = sqlContext.createDataset(descriptions, Encoders.STRING()); 
     Dataset<Row> nameValueDataSetWithId = nameValueDataSet.toDF("name","caption").withColumn("id",functions.monotonically_increasing_id()).select("*"); 
     Dataset<Row> descriptionDataSetId = descriptionDataSet.withColumn("id",functions.monotonically_increasing_id()).select("*"); 
     nameValueDataSetWithId.join(descriptionDataSetId ,"id").show(); 
    } 
} 

Это печатает ниже. Надеюсь, что это помогает

enter image description here

+0

Tnaks за ваш ответ. Но у меня проблема. «Метод withColumn (String, Column) в типе Dataset не применим для аргументов (String, MonotonicallyIncreasingID)». withColumn функция не поддерживает MonotonicallyIncreasingID –

+0

@SVP добавил образец Java. Я не уверен на 100% производительности или запускаю это в кластере. Работает на моем автономном узле –

+0

Спасибо @Ramachandran G A. Это действительно помогло мне. Спасибо за Ваш ответ....... –

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