我正在使用Spark结构化流技术从Kafka中读取数据,并且尝试基于列表的内容创建一个新列。
我对数据建模如下:
case class Product(properties: List[Property])
case class Property(code: String, value: String)
我这样读:
spark
.readStream
.load()
.select($"value".cast("STRING").as("value"))
.select(from_json($"value", schema).as("product").as[Product])
.withColumn("articleType", when(array_contains($"properties.code", "ATY"), $"properties.value")
这种方法会创建一个名为“ articleType”的新列,其中包含“ ATY”时的所有属性值,但我只希望ATY值位于该列中。
基本上我想做这样的事情
properties.filter(_.code == "ATY").map(_.value)
我对Spark还是很陌生,所以也许这不是正确的方法,但是任何指针都会有所帮助。
答案 0 :(得分:0)
设法使用udf解决了这个问题。
val getArticleType = udf((properties: Seq[Row]) => {
properties.size.toString
properties.find(_.getString(2) == "ATY").map(_.getString(1))
}, StringType)
并像这样使用它:
.withColumn("articleType", getArticleType(col("properties")))