如何在Spark Shell中映射不同类型的三个元素?

时间:2018-10-27 23:48:45

标签: scala apache-spark

从文本文件创建RDD后,我需要使用.map创建类型为[Int,String,String]的新RDD ...每个元素均以逗号分隔。我不明白如何定义每条记录具有三种不同数据类型的RDD。

到目前为止,我有:

val abc1 = sc.textFile("hi.txt")
val abc2 = abc1.map(i => i.split(,))

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,则说明您正在阅读一个文本文件以创建一个RDD[String],其中每个字符串都是文件中的一条记录(一行)。但是,这些记录包含一个整数值,后跟两个字符串值以及一个逗号分隔符。 (例如,一条记录可能类似于“ 5,string1,string2”。)

RDD实际上只能具有一种记录类型。似乎您想要获得一种RDD[(Int, String, String)]的类型-其中RDD的类型是Int,{{1的 tuple }}和String。 (顺便说一下,这是String的简写。如果您不熟悉 Scala 元组,this link可能会有所帮助。)

对吗?

如果是这样,RDD[Tuple3[Int, String, String]]是适当的操作。但是,map操作将返回一个.split,因此以下操作将导致Array[String]作为RDD[Array[String]]的类型。

abc2

BTW,下划线val abc1 = sc.textFile("hi.txt") val abc2 = abc1.map(_.split(",")) 的使用是以下内容的简写:

_

为了获得所需的类型,应使用类似于以下内容的表达式:

val abc1 = sc.textFile("hi.txt")
val abc2 = abc1.map(s => s.split(","))

请注意,这假定您始终具有三个元素,并且第一个是整数。如果不是这种情况,您将得到错误消息(并且您可能希望添加更多错误处理)。