我有一个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类完全匹配输入模式。)
答案 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