将Java Map转换为Spark DataFrame(Java API)

时间:2016-09-27 06:58:26

标签: java dictionary apache-spark spark-dataframe

我尝试使用Spark( Java API )来获取内存中Map(可能包含其他嵌套Maps作为其值)和将其转换为数据帧。我我需要这些内容:

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

但是我很难在这里看到森林穿过树林......有什么想法吗?同样,这可能是Map<String,String>Map<String,Map>,其中可能有几个嵌套的地图图层 - 地图内部 - 地图内部等。

1 个答案:

答案 0 :(得分: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)。希望这有帮助!

编辑:显然你可以删除所有的打印件。我这样做是为了可视化目的!