2017-03-31 59 views
-1

我想創建一個帶有110列的數據框,因此當我嘗試將rdd轉換爲數據框時,我創建了一個具有110個屬性的類。轉換爲數據幀錯誤

case class Myclass(var cin_nb:String,...........,var last:String) 
import sqlContext.implicts._ 
file2.map(_.split("\t")).map(a=>Myclass(a(0),a(1),a(2),a(3),.....a(110)).ToDf() 

我得到這個錯誤:

not enough arguments for method apply: (cin_nb: String,...........,last:String) 

我使用Scala和火花1.6。謝謝

+0

缺少一個字做這方面的一個例子。應該是'case class Myclass(var cin_nb:String,...........,var last:String)' – Pushkr

回答

1

你不能這樣做,因爲有大小寫類/ StructType模式的22列的硬限制。這是由於Scala中的Tuple僅支持22個元素!要將數據幀增長到更多列,您需要使用.withColumn函數來擴展它,或者從文件直接加載到Dataframe中。例如,來自實木複合地板,或者使用databricks csv解析器。

編輯:如何用.withColumn

import scala.util.Random 

val numCols = 100 
val numRows = 5 
val delimiter = "\t" 

def generateRowData = (0 until numCols).map(i => Random.alphanumeric.take(5).mkString).mkString(delimiter) 

val df = sc.parallelize((0 until numRows).map(i => generateRowData).toList).toDF("data") 

def extractCol(i: Int, sep: String) = udf[String, String](_.split(sep)(i)) 

val result = (0 until numCols).foldLeft(df){case (acc,i) => acc.withColumn(s"c$i", extractCol(i,delimiter)($"data"))}.drop($"data") 

result.printSchema 
result.show 
+0

我無法從文件直接加載到Dataframe中;我必須從文件中過濾一些行(版權行)。 –

+0

您將需要使用.withColumn選項,然後......將所有內容加載到單列的Daraframe中,然後使用udf –

+0

解析出該列中的位,謝謝;請給我舉個例子 –