[英]Add multiple columns with map logic without using UDF
我想使用 addressParser 函數從給定的表結構中解析地址列以獲取號碼、街道、城市和國家。
樣本輸入:
地址標識 | 地址 |
---|---|
添加001 | "384, East Avenue Street, 紐約, 美國 |
添加002 | "123, Maccolm Street, 哥本哈根, 丹麥" |
附上示例代碼供參考:
object ParseAddress extends App {
val spark = SparkSession.builder().master("local[*]").appName("ParseAddress ").getOrCreate()
import spark.implicits._
case class AddressRawData(addressId: String, address: String)
case class AddressData(
addressId: String,
address: String,
number: Option[Int],
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))
)
}
)
}
val addressDS: Dataset[AddressRawData] = addressDF.as[AddressRawData]
}
預期輸出:
地址標識 | 地址 | 數字 | 路 | 城市 | 國家 |
---|---|---|---|---|---|
添加001 | "384, East Avenue Street, 紐約, 美國 | 384 | 東大街 | 紐約 | 美國 |
添加002 | "123, Maccolm Street, 哥本哈根, 丹麥" | 123 | 麥考姆街 | 哥本哈根 | 丹麥 |
我不知道我應該如何將 addressDS 作為輸入轉換為函數來解析列數據。 非常感謝解決此問題的某種形式的幫助。
我認為一件重要的事情是,最好將您的函數設計為采用單個輸入並返回單個輸出(在您的場景中),如果您有一個集合或行數據集,您可以將每一行映射到這個函數,這就是為什么要制作所有這些多態函數(map、flatMap、fold……)的原因,對吧? 所以你可以實現一個方法,它接收一個AddressRawData
並返回一個AddressData
:
def singleAddressParser(unparsedAddress: AddressRawData): AddressData = {
val split = unparsedAddress.address.split(", ")
AddressData(
addressId = unparsedAddress.addressId,
address = unparsedAddress.address,
number = Some(split(0).toInt),
road = Some(split(1)),
city = Some(split(2)),
country = Some(split(3))
)
}
然后將每個原始數據映射到這個函數:
import org.apache.spark.sql.Dataset
val addressDS: Dataset[AddressData] =
addressDF.as[AddressRawData].map(singleAddressParser)
正如預期的那樣,這是輸出:
scala> addressDS.show(false)
+---------+-----------------------------------------+------+------------------+----------+-------+
|addressId|address |number|road |city |country|
+---------+-----------------------------------------+------+------------------+----------+-------+
|ADD001 |384, East Avenue Street, New York, USA |384 |East Avenue Street|New York |USA |
|ADD002 |123, Malccolm Street, Copenhagen, Denmark|123 |Malccolm Street |Copenhagen|Denmark|
+---------+-----------------------------------------+------+------------------+----------+-------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.