如何在不使用案例类但使用structType的情况下创建数据集(而非数据框)



如何使用StructType

创建数据集

我们可以创建一个Dataset如下:

case class Person(name: String, age: Int)
val personDS = Seq(Person("Max", 33), Person("Adam", 32), Person("Muller", 
62)).toDS()
personDS.show()

有没有使用案例类创建Dataset的方法?

我想使用案例类和使用StructType创建DataFrame

如果您知道如何创建数据框,现在已经如何创建数据集:

DataFrame = Dataset[Row].

这意味着什么?尝试:

val df : DataFrame = spark.createDataFrame(...) // with StructType
import org.apache.spark.sql._
val ds : Dataset[Row] = df; // no error, as DataFrame is only a type alias of Dataset[Row]

这是一个有趣的问题,从某种意义上说,我看不到一个人想要它的原因。

如何使用" structtype"创建数据集

我然后问一个非常相似的问题...

您为什么要用StructType"交易"案例类?这会给您一个案例类无法的?

您使用案例类的原因是它可以一次提供两件事:

  1. 快速地描述您的模式

  2. 与您的数据一起工作变成类型安全

关于1.作为Scala开发人员,您将定义描述您数据的业务对象。无论如何,您都必须这样做(除非您喜欢元组和_1等)。

关于类型安全性(在1.和2中)是关于转换数据以利用可以帮助您找到您期望字符串但具有INT的位置的Scala编译器。使用StructType,支票仅在运行时(不是编译时间)。

说,您的问题的答案是"是"。

您可以使用StructType创建数据集。

scala> val personDS = Seq(("Max", 33), ("Adam", 32), ("Muller", 62)).toDS
personDS: org.apache.spark.sql.Dataset[(String, Int)] = [_1: string, _2: int]
scala> personDS.show
+------+---+
|    _1| _2|
+------+---+
|   Max| 33|
|  Adam| 32|
|Muller| 62|
+------+---+

您可能想知道为什么我看不到列名。这正是案例类不仅可以为您提供类型的案例类别的原因。

的名称。

但是,如果您不喜欢案例类,则可以使用一个技巧来避免处理案例类。

val withNames = personDS.toDF("name", "age").as[(String, Int)]
scala> withNames.show
+------+---+
|  name|age|
+------+---+
|   Max| 33|
|  Adam| 32|
|Muller| 62|
+------+---+

这是您可以使用structType创建数据集的方法:

import org.apache.spark.sql.types._
import org.apache.spark.sql.Row
val schema = StructType(Seq(
  StructField("name", StringType, true),
  StructField("age", IntegerType, true)
))
val data = Seq(
  Row("Max", 33),
  Row("Adam", 32),
  Row("Muller", 62)
)
val personDF = spark.createDataFrame(
  spark.sparkContext.parallelize(data),
  schema
)
val yourDS = personDF.as[(String, Int)]
yourDS.show()
+------+---+
|  name|age|
+------+---+
|   Max| 33|
|  Adam| 32|
|Muller| 62|
+------+---+

yourDSorg.apache.spark.sql.Dataset[(String, Int)]

您的问题中的personDS是类型org.apache.spark.sql.Dataset[Person],所以这不给出相同的结果。

请参阅此帖子以获取有关如何创建数据集的更多信息。

相关内容

  • 没有找到相关文章

最新更新