如果列名包含空格,是否可以将DataFrame转换为案例类的数据集?

时间:2017-06-07 18:32:48

标签: apache-spark apache-spark-sql

我有一个Spark DataFrame,其中列名包含空格。是否可以将这些行转换为案例类?

例如,如果我这样做:

val data = Seq(1, 2, 3).toDF("a number")
case class Record(`a number`: Int)
data.as[Record]

我得到了这个例外:

org.apache.spark.sql.AnalysisException: cannot resolve '`a$u0020number`' given input columns: [a number];
  at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)
  at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:77)
  at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:74)
  at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:310)
...

有没有办法做到这一点?

(当然我可以通过在转换为case类之前重命名该列来解决这个问题。我希望case类完全匹配输入模式。)

2 个答案:

答案 0 :(得分:0)

你能试试这个解决方案,这对我有用,而不会改变列名。

import sqlContext.implicits._
case class Record(`a number`: Int)
val data = Seq(1, 2, 3)
val recDF = data.map(x => Record(x)).toDF()
recDF.collect().foreach(println)

[1]
[2]
[3]

答案 1 :(得分:0)

我使用的是Spark 1.6.0。代码中唯一不适合我的部分是您设置测试数据的部分。我必须使用一系列元组而不是整数序列:

case class Record(`a number`:Int)
val data = Seq(Tuple1(1),Tuple1(2),Tuple1(3)).toDF("a number")
data.as[Record] 
// returns org.apache.spark.sql.Data[Record] = [a$u0020number: int]

如果您需要Dataframe而不是Dataset,则可以随时使用其他toDF

data.as[Record].toDF