如何在Scala中创建存储数据集中其他列的数据的Scala trait,然后创建一个列存储该trait的新数据集?

vq8itlhq  于 2023-02-08  发布在  Scala
关注(0)|答案(1)|浏览(147)

我是Scala新手,目前正在研究Scala和Spark的数据集。基于下面的输入数据集,我尝试创建一个新的数据集(见下文)。在新的数据集中,我希望有一个包含Scala trait Seq[order_summary]的新列。Scala trait存储从输入数据集中获取的对应的NameTicket NumberSeat Number的数据。
我已经实现了input_dataset.groupyBy("Name")来组织数据集,并尝试了df.withColumn("NewColumn", struct(df("a"), df("b")))来将不同的列组合在一起。然而,我想使用Scala特性来代替,并且还坚持将名称与票号匹配。有人知道如何解决这个问题或为我指出正确的方向吗?
输入数据集:input_dataset
名称类型为字符串。票据编号类型为整数

+----+---------------+-------------+
|Name| Ticket Number | Seat Number |
+----+---------------+-------------+
|Adam|      123      |     AB      |
|Adam|      456      |     AC      |
|Adam|      789      |     AD      |
|Bob |     1234      |     BA      |
|Bob |     5678      |     BB      |
|Sam |      987      |     CA      |
|Sam |      654      |     CB      |
|Sam |      321      |     CC      |
|Sam |      876      |     CD      |
+----+---------------+-------------+

输出数据集
类型是StringPurchase Order Summary是一个traitSeq[order_summary]

+----+-----------------------------------------------------+
|Name| Purchase Order Summary                              |
+----+-----------------------------------------------------+
|Adam|((Adam,123,AB),(Adam,456,AC),(Adam,789,AD))          | 
|Bob |((Bob,1234,BA),(Bob,5678,BB))                        |
|Sam |((Sam,987,CA),(Sam,654,CB),(Sam,321,CC),(Sam,876,CD))|
+----+-----------------------------------------------------+
zujrkrfu

zujrkrfu1#

我很确定Spark有一个map方法。
所以你只需要创建一个case类

case class PurchaseOrderSummary(name: String, ticketNum: Long, seatNum: Int)

并在DF的Map中示例化它,然后将它收集到列表中。

df.map(row => PurchaseOrderSummary(row.getString(0), row.getLong(1), row.getInt(2))).collectAsList

collectAsList应该从RDD中检索数据并将其转换为scala List[PurchaseOrderSummary]。

相关问题