gpt4 book ai didi

java - 使用数组解析 Json 对象并在 Java 中使用 Apache Spark 映射到多个对

转载 作者:行者123 更新时间:2023-11-30 08:00:40 24 4
gpt4 key购买 nike

我用谷歌搜索了一整天,找不到直接的答案,所以最后在这里发布了一个问题。

我有一个包含行分隔的 json 对象的文件:

{"device_id": "103b", "timestamp": 1436941050, "rooms": ["Office", "Foyer"]}
{"device_id": "103b", "timestamp": 1435677490, "rooms": ["Office", "Lab"]}
{"device_id": "103b", "timestamp": 1436673850, "rooms": ["Office", "Foyer"]}

我的目标是使用 Java 中的 Apache Spark 解析此文件。我引用了 How to Parsing CSV or JSON File with Apache Spark到目前为止,我可以使用 Gson 成功地将每一行 json 解析为 JavaRDD .

JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> data = sc.textFile("fileName");
JavaRDD<JsonObject> records = data.map(new Function<String, JsonObject>() {
public JsonObject call(String line) throws Exception {
Gson gson = new Gson();
JsonObject json = gson.fromJson(line, JsonObject.class);
return json;
}
});

我真正卡住的地方是我想反序列化“rooms”数组,以便它适合我的类(class) Event

public class Event implements Serializable {
public static final long serialVersionUID = 42L;
private String deviceId;
private int timestamp;
private String room;
// constructor , getters and setters
}

换句话说,从这一行开始:

{"device_id": "103b", "timestamp": 1436941050, "rooms": ["Office", "Foyer"]}

我想在 Spark 中创建两个事件对象:

obj1: deviceId = "103b", timestamp = 1436941050, room = "Office"
obj2: deviceId = "103b", timestamp = 1436941050, room = "Foyer"

我做了我的小搜索并尝试了 flatMapVlue,但没有运气......它给我一个错误......

JavaRDD<Event> events = records.flatMapValue(new Function<JsonObject, Iterable<Event>>() {
public Iterable<Event> call(JsonObject json) throws Exception {
JsonArray rooms = json.get("rooms").getAsJsonArray();
List<Event> data = new LinkedList<Event>();
for (JsonElement room : rooms) {
data.add(new Event(json.get("device_id").getAsString(), json.get("timestamp").getAsInt(), room.toString()));
}
return data;
}
});

我对 Spark 和 Map/Reduce 还很陌生。如果你能帮助我,我将不胜感激。提前致谢!

最佳答案

如果将 json 数据加载到 DataFrame 中:

DataFrame df = sqlContext.read().json("/path/to/json");

您可以通过 explode 轻松地做到这一点。

df.select(
df.col("device_id"),
df.col("timestamp"),
org.apache.spark.sql.functions.explode(df.col("rooms")).as("room")
);

对于输入:

{"device_id": "1", "timestamp": 1436941050, "rooms": ["Office", "Foyer"]}
{"device_id": "2", "timestamp": 1435677490, "rooms": ["Office", "Lab"]}
{"device_id": "3", "timestamp": 1436673850, "rooms": ["Office", "Foyer"]}

您将获得:

+---------+------+----------+
|device_id| room| timestamp|
+---------+------+----------+
| 1|Office|1436941050|
| 1| Foyer|1436941050|
| 2|Office|1435677490|
| 2| Lab|1435677490|
| 3|Office|1436673850|
| 3| Foyer|1436673850|
+---------+------+----------+

关于java - 使用数组解析 Json 对象并在 Java 中使用 Apache Spark 映射到多个对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38345514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com