我有一个数据集,具有以下案例类类型:
case class AddressRawData(
addressId: String,
customerId: String,
address: String
)
我要将其转换为:
case class AddressData(
addressId: String,
customerId: String,
address: String,
number: Option[Int], //i.e. it is optional
road: Option[String],
city: Option[String],
country: Option[String]
)
使用解析器函数:
def addressParser(unparsedAddress: Seq[AddressData]): Seq[AddressData] = {
unparsedAddress.map(address => {
val split = address.address.split(", ")
address.copy(
number = Some(split(0).toInt),
road = Some(split(1)),
city = Some(split(2)),
country = Some(split(3))
)
}
)
}
我是scala和spark的新手,有没有人能让我知道这是怎么做到的?
1条答案
按热度按时间uz75evzq1#
你走对了路!当然,有多种方法可以做到这一点。但是,由于你已经在创建一些case类的过程中,并且已经开始创建一个解析函数,一个优雅的解决方案是使用Dataset的
map
函数。从文档中,这个map
函数签名如下:其中
T
是起始类型(在本例中为AddressRawData
),U
是要得到的类型(在本例中为AddressData
)。因此,map
函数的输入是一个将AddressRawData
转换为AddressData
的函数。这可能就是您开始创建的addressParser
!现在,您当前的
addressParser
具有以下签名:为了能够将其提供给
map
函数,我们需要创建以下签名:了解了所有这些,我们就可以进一步工作了!下面是一个例子:
正如您所看到的,由于您已经预见到解析可能出错,因此可以很容易地使用
scala.util.Try
来尝试获取原始地址的片段,并在其中添加一些健壮性(第二行包含一些null
值,它无法解析address
字符串)。希望这对你有帮助!