2016-04-21 932 views
6

我想從可匹配現有模式的字符串列表創建DataFrame。 這是我的代碼。Scala Spark:如何從字符串列表創建RDD並將其轉換爲DataFrame

val rowValues = List("ann", "f", "90", "world", "23456") // fails 
    val rowValueTuple = ("ann", "f", "90", "world", "23456") //works 

    val newRow = sqlContext.sparkContext.parallelize(Seq(rowValueTuple)).toDF(df.columns: _*) 

    val newdf = df.unionAll(newRow).show() 

如果我使用字符串列表,相同的代碼將失敗。我看到區別在於rowValueTuple創建了一個Tuple。 由於rowValues列表的大小動態變化,我無法手動創建Tuple*對象。 我該怎麼做?我錯過了什麼?我如何將這個列表弄平以滿足要求?

感謝您的幫助,請。

+0

第一個爲您提供了一列和五行的DF。第二個給你一個單行的DF,其中包含一個元組。非常不同的事情。 –

回答

10

DataFrame具有固定列數的模式,因此按每個可變長度列表進行行操作似乎並不自然。無論如何,您可以使用現有架構從RDD [Row]創建您的DataFrame,如下所示:

val rdd = sqlContext.sparkContext.parallelize(Seq(rowValues)) 
val rowRdd = rdd.map(v => Row(v: _*)) 
val newRow = sqlContext.createDataFrame(rdd, df.schema) 
+0

Thanks @vitality。我確實嘗試過。但錯過了一些。我同意你的觀點。但我想對給定的一對數據框和行值列表執行此操作作爲參數。假定數據幀的列數和行值的長度相同。 – NehaM

+3

最後一行應該是 'val'newRow = sqlContext.createDataFrame(rowRdd,df.schema)''' 至少這就是我的工作原理。 – Rylan

+3

@Rylan:這裏是什麼'df'? – Dinosaurius

相關問題