如何使用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.作为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|
+------+---+
yourDS
是org.apache.spark.sql.Dataset[(String, Int)]
。
您的问题中的personDS
是类型org.apache.spark.sql.Dataset[Person]
,所以这不给出相同的结果。
请参阅此帖子以获取有关如何创建数据集的更多信息。