首页 > 解决方案 > spark - 将元组列表转换为数据集 - scala

问题描述

我正在尝试创建数据集的示例,以下一个有效:

val lname = List(("Krishna", 32, "GWL"), ("Pankaj", 37, "BIHAR"), ("Sunil", 29, "Bangalre"))
import spark.implicits._
val rddLName = spark.sparkContext.parallelize(lname)
case class Test1(name: String, age: Int, place: String)
val ds1 = lname.toDS()
val ds2 = rddLName.toDS()
val ds3 = spark.createDataset(rddLName).as("Test1")
val ds4 = rddLName.toDF().as("Test1")

a) 但是如何使用 as[U](implicit : Encoder[u]) 创建一个数据集:我尝试了下面的代码,它给了我下面的错误。你能指导我一些参考。

错误:(41, 62) 找不到类型 Test1 的编码器。需要一个隐式 Encoder[Test1] 将 Test1 实例存储在数据集中。通过导入 spark.implicits._ 支持原始类型(Int、String 等)和产品类型(案例类)

val rddNew = lname map{case (x,y,z) => Test1(x,y,z)}
val ds5 = spark.sparkContext.parallelize(lname).toDF().as[Test]
ds5.show()

不支持以下代码。val ds5 = spark.sparkContext.parallelize(rddNew).toDF()

b) ds4.show() 为我提供带有 _1、_2 和 _3 的标题,如下所示:

+-------+---+--------+
|     _1| _2|      _3|
+-------+---+--------+
|Krishna| 32|     GWL|
| Pankaj| 37|   BIHAR|
|  Sunil| 29|Bangalre|
+-------+---+--------+

如何使用我提供的架构获取姓名、年龄和地点标题。

标签: apache-spark

解决方案


case class Test1(name: String, age: Int, place: String)

必须是顶级类,不能在方法中声明。

ds4.show() 为我提供带有 _1、_2 和 _3 的标题,如下所示

您的列表声明包含元组的非对象,Spark 不知道如何命名列。

List(("Krishna", 32, "GWL"), ("Pankaj", 37, "BIHAR"), ("Sunil", 29, "Bangalre"))
  1. 提供列名
import spark.implicits._

val lname: Dataset[Test1] = List(("Krishna", 32, "GWL"), ("Pankaj", 37, "BIHAR"), ("Sunil", 29, "Bangalre"))
  .toDF("name", "age", "place")
  .as[Test1]
lname.show()

+-------+---+--------+
|   name|age|   place|
+-------+---+--------+
|Krishna| 32|     GWL|
| Pankaj| 37|   BIHAR|
|  Sunil| 29|Bangalre|
+-------+---+--------+
  1. 显式更改列名
val ds5 = spark.sparkContext.parallelize(lname).toDF()
      .withColumnRenamed("_1", "name")
      .withColumnRenamed("_2", "age")
      .withColumnRenamed("_3", "place").as[Test1]
    ds5.show()

+-------+---+--------+
|   name|age|   place|
+-------+---+--------+
|Krishna| 32|     GWL|
| Pankaj| 37|   BIHAR|
|  Sunil| 29|Bangalre|
+-------+---+--------+

推荐阅读