Python 将RDD[Map[String,String]]转换为Spark数据帧

Python 将RDD[Map[String,String]]转换为Spark数据帧,python,json,scala,apache-spark,rdd,Python,Json,Scala,Apache Spark,Rdd,我正在尝试将val rec:RDD[Map[String,String]]转换为Spark数据帧 但当我执行时: val sqlContext = new SQLContext(sc) val df = sqlContext.createDataFrame(rec, classOf[Map[String, String]]) df.write.json("/tmp/file.json") json文件中充满了空对象: {} {} {} {} {} 我将其转换为json仅仅是因为我想保存r

我正在尝试将
val rec:RDD[Map[String,String]]
转换为Spark数据帧

但当我执行时:

val sqlContext = new SQLContext(sc)
val df = sqlContext.createDataFrame(rec, classOf[Map[String, String]])

df.write.json("/tmp/file.json") 
json文件中充满了空对象:

{}
{}
{}
{}
{}
我将其转换为json仅仅是因为我想保存
rec
val,然后在python中与SQLContext对象一起重用它

所以问题是如何保存我在Scala中创建的
RDD[HashMap[String,String]]
,然后在Python中重用

更新

rec
val包含

Map(Param_timestamp -> 2017-03-28T02:00:02.887, Param_querytype -> listing, Param_slug -> /salute-beauty-fitness/bellezza-cura-del-corpo/cosmesi/makeup, Param_br -> CAUDALIE)
df.show()
返回:

++
||
++
||
... all the 20 lines are the alike "||"
||
++
only showing top 20 rows

我相信,只要掌握了模式,就可以通过使用StructField和StructType重新创建它。至于scala,我并不完全熟悉它,但Java中的一个小示例可能会有所帮助(稍后有更多时间时,我会将其转换为scala):


rec
的内容是什么?
df.show()
的输出是什么?@L.CWI刚刚更新了我的问题在createDataframe中使用
StructType(StructField(“timeStamp”,StringType,false)::StructField(“querytype”,StringType,false)::StructField(“br”,StringType,false)::Nil)
?(我对scala不太了解,但在创建dataframe时需要如何指定模式,因为它是空的,我认为这里使用了错误的模式)但我有一个hashmap,hashmap中的键应该是字段的名称,所有值都是字符串,对吗?我有一个在运行时生成的动态数量的字段,所以StructType应该是动态确定的。
    JavaSparkContext jsc = new JavaSparkContext(
            new SparkConf().setAppName("test").setMaster("local[*]"));
    jsc.setLogLevel("ERROR");
    System.setProperty("hadoop.home.dir", "C:\\Temp\\tt\\Tools");

    List<Tuple2<String, String>> test = new ArrayList<Tuple2<String, String>>();
    Tuple2<String, String> tt = new Tuple2<String, String>("key", "val1");
    test.add(tt);
    tt = new Tuple2<String, String>("key", "val2");
    test.add(tt);
    tt = new Tuple2<String, String>("key2", "val");
    test.add(tt);

    JavaPairRDD<String, String> testRDD = jsc.parallelizePairs(test);

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

    SparkContext sc = JavaSparkContext.toSparkContext(jsc);
    SparkSession ss = new SparkSession(sc);
    StructField[] fields = {
            DataTypes.createStructField("key", DataTypes.StringType, false),
            DataTypes.createStructField("val", DataTypes.StringType, false) };
    StructType schema = DataTypes.createStructType(fields);
    JavaRDD<Row> testRowRDD = testRDD.map(line -> RowFactory.create(line._1, line._2));
    Dataset<Row> myDF = ss.createDataFrame(testRowRDD, schema);
    myDF.show();

    myDF.write().json("test.json");

    jsc.close();
{"key":"key2","val":"val"}