[英]Convert RDD[Map[String, String]] to Spark dataframe
我正在尝试将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中重用?
UPDATE
rec
包含
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):
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();
输出是几个Json文件,每个文件包含如下一行:
{"key":"key2","val":"val"}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.