2017-06-13 20 views
0

基本的に私が達成しようとしているのは、4列のテーブルがあり、DataFrame -DF1に公開しています。今度は、DF1の各行を別のハイブテーブル(基本的にはDF2 - Column1、Column2、Column3)に保存したいが、column3の値はDataFrame DF1の ' - 'で区切られた行になる。 Spark-ScalaでListまたはRDDのリストをDataFrameに変換する

val df = hiveContext.sql("from hive_table SELECT *") 
val writeToHiveDf = df.filter(new Column("id").isNotNull) 

var builder : List[(String, String, String)] = Nil 
    var finalOne = new ListBuffer[List[(String, String, String)]]() 
    writeToHiveDf.rdd.collect().foreach { 
     row => 
     val item = row.mkString("[email protected]") 
     builder = List(List("dummy", "NEVER_NULL_CONSTRAINT", "some alpha")).map{case List(a,b,c) => (a,b,c)} 
     finalOne += builder 
    } 

は今、私は私が直接、またはRDDを経由してデータフレームに変換したいリストのリストとして finalOneを持っています。

var listRDD = sc.parallelize(finalOne) //Converts to RDD - It works. 
val dataFrameForHive : DataFrame = listRDD.toDF("table_name", "constraint_applied", "data") //Doesn't work 

エラー:

java.lang.ClassCastException: org.apache.spark.sql.types.ArrayType cannot be cast to org.apache.spark.sql.types.StructType 
    at org.apache.spark.sql.SQLContext.createDataFrame(SQLContext.scala:414) 
    at org.apache.spark.sql.SQLImplicits.rddToDataFrameHolder(SQLImplicits.scala:94) 

いくつかのいずれかは、私がデータフレームにこれを変換する正しい方法を理解するのに役立ちます。あなたのサポートのために事前にトンをありがとう。

+1

あなたは文字列型またはタイプの1列の3列、データフレームを持っているために何スキーマを期待しています要素が構造体(3文字列)の配列? –

答えて

1

あなたのデータフレームに文字列型の3列をしたい場合、あなたはList[List[(String,String,String)]]List[(String,String,String)]にを平らにする必要があります

var listRDD = sc.parallelize(finalOne.flatten) // makes List[(String,String,String)] 
val dataFrameForHive : DataFrame = listRDD.toDF("table_name", "constraint_applied", "data") 
関連する問題