Я читаю данные из Kafka, используя Spark Structured Streaming, и пытаюсь создать новый столбец на основе содержимого списка.

Я моделирую свои данные так:

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
ronald de Haan 7 Ноя 2018 в 16:30

1 ответ

Лучший ответ

Удалось решить эту проблему с помощью udf.

val getArticleType = udf((properties: Seq[Row]) => {
  properties.size.toString
  properties.find(_.getString(2) == "ATY").map(_.getString(1))
}, StringType)

И используйте это так:

.withColumn("articleType", getArticleType(col("properties")))
0
ronald de Haan 14 Ноя 2018 в 07:41