Scala + Spark中String的数组到Array的数组

时间:2017-02-17 13:08:38

标签: scala nested spark-dataframe

我目前正在使用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中相当新,所以有人可以指导我如何构建这种类型的函数吗?

感谢。

1 个答案:

答案 0 :(得分:2)

我不知道我是否理解你的问题,但map可能是你的朋友。

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)
    }
}