apache-spark - 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|
+-------+---+--------+
如何使用我提供的架构获取姓名、年龄和地点标题。
解决方案
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"))
- 提供列名
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|
+-------+---+--------+
- 显式更改列名
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|
+-------+---+--------+
推荐阅读
- serilog - serilog LoggerConfiguration 通过 webconfig
- r - mutate_impl(.data, dots) 评估错误:找不到对象
- javascript - 如何在反应中将输入值设置为null
- python - 如何使用自定义版本的 Python 使用 Cython 进行编译
- python - 阅读文件并找出一组独特的单词
- objective-c - 比较 int 和 id 时,Objective C isEqual 不评估
- php - wp sanitize_callback 和静态方法
- f# - 键入记录字段以保存具有类型参数的函数
- c++ - 在 for 循环中处理复杂的 send recv 消息
- android - Android Studio 中的导航抽屉模板未在 xml 文件中显示任何设计