Spark的Dataframe(Dataset)转Json字符串
Spark的Dataframe(Dataset)转Json,网上很多都说的太麻烦了,让你先转换成collect,然后按照不同的filed字段去转义。
完全不用那么麻烦
原理就是先把Dataset<row>就是Dataframe对象(带schema的数据类型)转换成一行一行的String类型数据
Dataset<String> stringDataset = Dataset<Row> rowDataset.toJSON();
这个时候调用stringDataset的show方法,你可以看到你的数据如下:
+-----------------------------------------------------------------+ | value| +--------------------+ |{"taskConfigId":"123", "xxx": 123, "date": "2018-11-28 00:12:21"}| |{"taskConfigId":"321", "xxx": 123, "date": "2018-11-28 00:12:21"}| |{"taskConfigId":"qwe", "xxx": 123, "date": "2018-11-28 00:12:21"}| |{"taskConfigId":"34", "xxx": 123, "date": "2018-11-28 00:12:21"}| |{"taskConfigId":"341", "xxx": 123, "date": "2018-11-28 00:12:21"}| +------------------------------------------------------------------+
就相当于你的每一行数据都是一个JSON字样的字符串,你只需要先把这个对象collectAsList,转换成列表,然后循环去处理这些json字符串,拼装为一个jsonarray,然后你想怎么转换就怎么转换。
代码如下:超级简单
public static String toJsonString(Dataset<Row> rowDataset) {
if (rowDataset == null) {
return StringUtils.EMPTY;
}
JSONArray jsonArray = new JSONArray();
Dataset<String> stringDataset = rowDataset.toJSON();
stringDataset.show();
List<String> stringList = stringDataset.collectAsList();
for (String jsonStr : stringList) {
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
jsonArray.add(jsonObject);
}
return jsonArray.toString();
}
代码是转换成json字符串了,如果你想要JSONARRAY这样的对象也是可以的,只需要自己改一下代码就行。
那么我们要转换成这个json字符串干嘛了,当然是去调用HTTP类型的接口的时候,把数据作为body对象传送。
毕竟HTTP的接口对于对象或者json字符串处理起来更友好。