Spark 2.0.0 - JSON格式错误输出

Spark 2.0.0 - JSON malformed output

本文关键字:错误 输出 格式 Spark JSON      更新时间:2023-09-26

我正在用Spark和Scala处理数据,并将其保存在json

df2.write.mode("overwrite").json("mydata")

输出如下所示:

{"GPS_LAT":xx.xxxxx,"GPS_LONG":xx.xxxxx,"count":10063}
{"GPS_LAT":xx.xxxxx,"GPS_LONG":xx.xxxxx,"count":3142}
{"GPS_LAT":xx.xxxxx,"GPS_LONG":xx.xxxxx,"count":7766}

我使用数据创建一个可视化使用d3,使用d3.json:

d3.json("mydata.json", function(d){
                console.log(d)
};

我的问题是d3.js期望json格式化如下:

[{"GPS_LAT":xx.xxxxx,"GPS_LONG":xx.xxxxx,"count":10063},
{"GPS_LAT":xx.xxxxx,"GPS_LONG":xx.xxxxx,"count":3142},
{"GPS_LAT":xx.xxxxx,"GPS_LONG":xx.xxxxx,"count":7766}]

谁错了?Spark还是d3 ?在不手动添加[,]的情况下,我能做些什么来缓解这种情况?

我不知道Spark,但我可以说这不是一个有效的JSON,你只是有一堆对象没有包装在一个数组中。所以,对于"谁错了?",我想说是Spark。

但是有一个(丑陋的)解决方法。使用d3.text加载内容(一堆对象):

d3.text("data.json", function(data){});

那么,您的data将是一个字符串。下一步是用新行分隔字符串:

data = data.match(/[^'r'n]+/g);

然后,将其转换为对象数组:

data = data.map(function(d){
    return JSON.parse(d)
});

一起:

d3.text("data.json", function(data){
    data = data.match(/[^'r'n]+/g);
    data = data.map(function(d){
        return JSON.parse(d)
    });
    //now you can use 'data' here
});

检查这个柱塞中的控制台:https://plnkr.co/edit/ER1oXyWZL62dwxlgaenP?p=preview

并且,现在你有一个对象数组,你可以把它传递给你的D3代码。

PS:如果数据中有日期,这可能不工作。

我们也可以有一个小的shell脚本:

sed -i '' 's/}/},/g' file  # Add comma between each line
sed -i '' '$ s/.$/]/' file # Replace last comma with ]
sed -i '' '1s/^/[/' file   # Add [ at beginning of file