簡體   English   中英

在不使用 UDF 的情況下添加具有映射邏輯的多列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM