我当前正在使用Spark和Scala 2.11.8
我有以下模式:
root
|-- partnumber: string (nullable = true)
|-- brandlabel: string (nullable = true)
|-- availabledate: string (nullable = true)
|-- descriptions: array (nullable = true)
|-- |-- element: string (containsNull = true)
我试图使用UDF将其转换为以下内容:
root
|-- partnumber: string (nullable = true)
|-- brandlabel: string (nullable = true)
|-- availabledate: string (nullable = true)
|-- description: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- value: string (nullable = true)
| | |-- code: string (nullable = true)
| | |-- cost: int(nullable = true)
因此,源数据看起来像这样:
[WrappedArray(a abc 100,b abc 300)]
[WrappedArray(c abc 400)]
我需要使用"(空间)作为定界符,但不知道如何在Scala中执行此操作。
def convert(product: Seq[String]): Seq[Row] = {
??/
}
我在Scala中很新,所以有人可以指导我如何构建此类功能?
谢谢。
我不知道我是否理解您的问题,但地图可能是您的朋友。
case class Row(a: String, b: String, c: Int)
val value = List(List("a", "abc", 123), List("b", "bcd", 321))
value map {
case List(a: String, b: String, c: Int) => Row(a,b,c);
}
如果您必须先解析:
val value2 = List("a b 123", "c d 345")
value2 map {
case s => {
val split = s.toString.split(" ")
Row(split(0), split(1), split(2).toInt)
}
}