Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如果列名包含空格,DataFrame能否转换为case类的Dataset?_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 如果列名包含空格,DataFrame能否转换为case类的Dataset?

Apache spark 如果列名包含空格,DataFrame能否转换为case类的Dataset?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个SparkDataFrame,其中列名包含空格。是否可以将这些行转换为案例类 例如,如果我这样做: 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:

我有一个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类与输入架构完全匹配。)

您能尝试一下这个解决方案吗,这在不更改列名的情况下对我有效

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]

我正在使用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]
如果您需要一个
数据帧
而不是
数据集
,则始终可以使用另一个
toDF

data.as[Record].toDF

谢谢不过,这对我来说并不是真的有效,因为在我的实际情况中,数据是作为
数据帧
加载的,它不是来自
序列
。使用
Seq.toDF
只是为了方便示例。很抱歉给你带来了困惑。