2016-10-26 6 views
1

Я обработки данных с искрой и Scala, и сохранить его в jsonСпарк 2.0.0 - 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? Что я могу сделать, чтобы облегчить эту ситуацию, не добавляя вручную [,]?

ответ

2

Я не знаю Spark, но могу сказать, что это не действительный JSON, у вас есть только куча объектов, которые не обернуты в массив. Итак, для «кто не прав?», я бы сказал, искра.

Но есть (уродливое) обходное решение. Используйте 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: Это может не сработать, если у вас есть даты в данных.

+0

Вот что я тоже подумал - Как может быть, что такая система, как Spark, производит сломанный выход ?! –

+0

Я не могу сказать, как я уже говорил, я никогда не использовал Спарк ... давайте подождем, чтобы увидеть чье-то мнение по этому поводу. –

+1

Потому что вывод не JSON, а [JSON Lines] (http://jsonlines.org/), и этот __ ожидаемый результат в Spark. –

1

Мы также можем иметь небольшой 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 

Это делает лечение без Javascript делает работу ног.

Смежные вопросы