2015-06-14 7 views
5

Ben birkaç satır içine her satır patlayabilir istiyorum dizilerDiziler dizisini birden çok satıra nasıl düzleştirebilirim? Bazı jsons ayrıştırma sonra

scala> val jj =sqlContext.jsonFile("/home/aahu/jj2.json") 
res68: org.apache.spark.sql.DataFrame = [r: array<bigint>] 
scala> jj.first() 
res69: org.apache.spark.sql.Row = [List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)] 

bir tek sütunluk DataFrame var. Nasıl?

düzenleme:

Orjinal json dosyası:

{"r": [0,1,2,3,4,5,6,7,8,9]} 
{"r": [0,1,2,3,4,5,6,7,8,9]} 

Bir RDD ya da 20 satır içeren bir DataFrame istiyorum.

Sadece burada flatMap kullanamazsınız - Ben kıvılcım ilgili komut ne olduğundan emin değilim:

scala> jj.flatMap(r => r) 
<console>:22: error: type mismatch; 
found : org.apache.spark.sql.Row 
required: TraversableOnce[?] 
       jj.flatMap(r => r) 
+0

lütfen orjinal json örneğini gönderin ve sonucun örneğini bekliyor – vvladymyrov

+0

@vvladymyrov düzenleniyor – dranxo

cevap

4

Sen ne arzu ulaşmak için DataFrame.explode kullanabilirsiniz. Aşağıda, örnek json verilerinizle kıvılcım kabuğunda denedim.

import scala.collection.mutable.ArrayBuffer 
val jj1 = jj.explode("r", "r1") {list : ArrayBuffer[Long] => list.toList } 
val jj2 = jj1.select($"r1") 
jj2.collect 

Anlamak API belgelerine başvurabilirsiniz daha DataFrame.explode

+1

Hangi versiyon spark/scala üzerindesınız? Ben yerel modda 1.4 kullanıyorum ve java.lang.ClassCastException olsun: scala.collection.immutable. $ Colon $ kolon scala.collection.mutable.ArrayBuffer için bu – dranxo

+0

kullanıyorum 1.3.1 –

+0

kullanıyorum teşekkürler, Sadece 1.3.1 üzerinde çalıştı ve – dranxo

3

Ben Spark 1.3.1 ile test ettik Yoksa kullanabilirsiniz Row.getAs fonksiyonu:

import scala.collection.mutable.ArrayBuffer 
val elementsRdd = jj.select(jj("r")).map(t=>t.getAs[ArrayBuffer[Long]](0)).flatMap(x=>x) 
elementsRdd.count() 
>>>Long = 20 
elementsRdd.take(5) 
>>>Array[Long] = Array(0, 1, 2, 3, 4) 
+0

çalışır Bu da çalışır. – dranxo

2

Kıvılcım olarak 1.3+ explode işlevini doğrudan ilgili sütun üzerinde kullanabilirsiniz:

İlgili konular