2016-09-27 98 views
0

我試圖使用Spark(Java API)將內存中的Map(可能包含其他嵌套的Maps作爲其值)轉換爲數據幀。我想需要沿着這些路線的東西:將Java映射轉換爲Spark DataFrame(Java API)

Map myMap = getSomehow(); 
RDD myRDD = sparkContext.makeRDD(myMap); // ??? 
DataFrame df = sparkContext.read(myRDD); // ??? 

但我有一個艱難的時間,通過這裏的樹木看到森林...任何想法?同樣,這可能是一個Map<String,String>Map<String,Map>,那裏可能是地圖 - 內 - 的 - 地圖 - 內 - 的 - 圖的幾個嵌套層等

回答

0

所以,我想的東西,不知道這是最有效的選擇,但我現在沒有看到任何其他。

SparkConf sf = new SparkConf().setAppName("name").setMaster("local[*]"); 
    JavaSparkContext sc = new JavaSparkContext(sf); 
    SQLContext sqlCon = new SQLContext(sc); 

    Map map = new HashMap<String, Map<String, String>>(); 
    map.put("test1", putMap); 

    HashMap putMap = new HashMap<String, String>(); 
    putMap.put("1", "test"); 


    List<Tuple2<String, HashMap>> list = new ArrayList<Tuple2<String, HashMap>>(); 

    Set<String> allKeys = map.keySet(); 
    for (String key : allKeys) { 
     list.add(new Tuple2<String, HashMap>(key, (HashMap) map.get(key))); 
    }; 

    JavaRDD<Tuple2<String, HashMap>> rdd = sc.parallelize(list); 

    System.out.println(rdd.first()); 

    List<StructField> fields = new ArrayList<>(); 
    StructField field1 = DataTypes.createStructField("String", DataTypes.StringType, true); 
    StructField field2 = DataTypes.createStructField("Map", 
      DataTypes.createMapType(DataTypes.StringType, DataTypes.StringType), true); 

    fields.add(field1); 
    fields.add(field2); 

    StructType struct = DataTypes.createStructType(fields); 

    JavaRDD<Row> rowRDD = rdd.map(new Function<Tuple2<String, HashMap>, Row>() { 

     @Override 
     public Row call(Tuple2<String, HashMap> arg0) throws Exception { 
      return RowFactory.create(arg0._1, arg0._2); 
     } 

    }); 

    DataFrame df = sqlCon.createDataFrame(rowRDD, struct); 

    df.show(); 

在這種情況下,我假定Dataframe中的Map是Type(String,String)。希望這可以幫助!

編輯:顯然你可以刪除所有的打印。我爲了可視化目的做了這個!