从流中派生新列

时间:2018-11-07 13:30:53

标签: scala spark-structured-streaming

我正在使用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还是很陌生,所以也许这不是正确的方法,但是任何指针都会有所帮助。

1 个答案:

答案 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")))