首页 > 解决方案 > 创建包含具有整数属性的案例类实例的 DataFrame

问题描述

Spark 无法将一系列此类实例转换为 DataFrame/Dataset,这不是一个很好的开发人员体验。

这是一个错误还是预期的功能?

考虑一个例子:

import spark.implicits._
case class Test(`9`: Double)

这失败了:

val failingTest = Seq(Test(9.0)).toDF()

这工作正常:

val successfulTest = Seq(9.0).toDF("9").as[Test]
successfulTest.show()

齐柏林飞艇

标签: scalaapache-spark

解决方案


如果您看到声明变量的先决条件以及如何命名它们,那么您如何指定变量名称是不允许的。

The variable name must start with a letter and cannot begin with a number or other characters

只需将您的案例类更改为使用不带符号的字符串变量名称,如下所示,它应该可以工作。

import spark.implicits._
case class Test(Id: Double)

val failingTest = Seq(Test(9.0)).toDS()

上面的代码行将为您提供一个测试数据集,如下所示:

failingTest: org.apache.spark.sql.Dataset[Test] = [Id: double]

val failingTest1 = Seq(test).toDF()

上面的行将为您提供一个 Dataset of Row,即 DataFrame,如下所示:

failingTest1: org.apache.spark.sql.DataFrame = [Id: double]

它给您错误,因为您没有以正确的格式提供名称。您也可以将其视为错误,因为当您创建我认为应该完成的案例类时,它不会给您错误。

如果您只删除值 9 并使用如下任何字符,您的代码也可以工作:

import spark.implicits._
case class Test1(`i`: Double)
val failingTest = Seq(Test1(9.0)).toDF()

推荐阅读