2017-07-10 7 views
1

私はRDD[List[Int]]の数を知らないので、Rdd[List[Int]]DataFrameに変換したいのですが、どうすればいいですか?RDD [List [Int]]をDataFrameに変換するには?

これは私の入力です:

val l1=Array(1,2,3,4) 
    val l2=Array(1,2,3,4) 
    val Lz=Seq(l1,l2) 
    val rdd1=sc.parallelize(Lz,2) 

これは私の結果を期待されています

+---+---+---+---+ 
| _1| _2| _3| _4| 
+---+---+---+---+ 
| 1| 2| 3| 4| 
| 1| 2| 3| 4| 
+---+---+---+---+ 
+0

あなたがl1'と 'l2''の数を知らないが、彼らは常に同じ長さになります? – philantrovert

+0

l1とl2のカウントは同じですが、リスト[Int]のカウントは常に同じ長さではありません。 – mentongwu

答えて

0

あなたはそれが

としてあなたの出力を与える必要があり、以下のソリューション

val rdd1=sc.parallelize(Lz,2).map(array => (array(0), array(1), array(2), array(3))).toDF() 
rdd1.show(false) 

を使用することができます

+---+---+---+---+ 
|_1 |_2 |_3 |_4 | 
+---+---+---+---+ 
|1 |2 |3 |4 | 
|1 |2 |3 |4 | 
+---+---+---+---+ 
0ラメシュの答え@
+0

リストの数が分かりません[Int] – mentongwu

1

は正しいですが、あなたはまた、次の操作を実行できます。

val l1=Array(1,2,3,4) 
val l2=Array(1,2,3,4) 
val Lz=Seq(l1,l2) 
val df = sc.parallelize(Lz,2).map{ 
    case Array(val1, val2, val3, val4) => (val1, val2, val3, val4) 
}.toDF 

df.show 
// +---+---+---+---+ 
// | _1| _2| _3| _4| 
// +---+---+---+---+ 
// | 1| 2| 3| 4| 
// | 1| 2| 3| 4| 
// +---+---+---+---+ 

あなたが列をたくさん持っている場合は、別々に進める必要があるだろうが、あなたはあなたのデータのスキーマを知っておく必要がありそうでない場合は、あなた'LL以下を実行することはできません。

val sch = df.schema // I just took the schema from the old df but you can add one programmatically 

val df2 = spark.createDataFrame(sc.parallelize(Lz,2).map{ Row.fromSeq(_) }, sch) 

df2.show 
// +---+---+---+---+ 
// | _1| _2| _3| _4| 
// +---+---+---+---+ 
// | 1| 2| 3| 4| 
// | 1| 2| 3| 4| 
// +---+---+---+---+ 

スキーマを提供していない限り、あなたは配列の列を持つ以外多くを行うことができなくなります。

val df3 = sc.parallelize(Lz,2).toDF 
// df3: org.apache.spark.sql.DataFrame = [value: array<int>] 
df3.show 
// +------------+ 
// |  value| 
// +------------+ 
// |[1, 2, 3, 4]| 
// |[1, 2, 3, 4]| 
// +------------+ 
df3.printSchema 
//root 
// |-- value: array (nullable = true) 
// | |-- element: integer (containsNull = false) 
+0

リスト[Int]のカウントがないのでスキーマを取得できません – mentongwu

+0

l1とl2の数は同じですがリスト[Int]の数は同じではありませんalwaryは同じ長さである必要があります。 – mentongwu

+0

それはできません。あなたがスキーマを提供しない限り、配列の配列を持っているだけです – eliasah

1

これを行うには、いくつかの他の、より良い機能的な方法があるかもしれませんが、これはあまりにも動作します:

def getSchema(myArray : Array[Int]): StructType = { 
    var schemaArray = scala.collection.mutable.ArrayBuffer[StructField]() 
    for((el,idx) <- myArray.view.zipWithIndex){ 
     schemaArray += StructField("col"+idx , IntegerType, true) 
    } 
    StructType(schemaArray) 
} 

val l1=Array(1,2,3,4) 
val l2=Array(1,2,3,4) 
val Lz=Seq(l1,l2) 
val rdd1=sc.parallelize(Lz,2).map(Row.fromSeq(_)) 
val schema = getSchema(l1) //Since both arrays will be of same type and size 
val df = sqlContext.createDataFrame(rdd1, schema) 
df.show() 

+----+----+----+----+ 
|col0|col1|col2|col3| 
+----+----+----+----+ 
| 1| 2| 3| 4| 
| 1| 2| 3| 4| 
+----+----+----+----+ 
関連する問題