转换为dataframe错误

时间:2017-03-31 14:45:05

标签: apache-spark dataframe apache-spark-sql

我想创建一个包含110列的数据框,所以当我尝试将rdd转换为dataframe时,我创建了一个包含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和spark 1.6。谢谢

1 个答案:

答案 0 :(得分:1)

您无法执行此操作,因为对于案例类/ StructType架构存在22列的硬限制。这是因为scala中的元组仅支持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