Итак, у меня есть строка искры x (тип: org.apache.spark.sql.Row), и я хочу преобразовать ее в другую искру y со всеми удаленными пустыми столбцами.
Я пишу работу с потоковым воспроизведением, которая выполняет некоторые преобразования потоковых данных и сохраняет их в Casssandra, и я пересекаю поток по строкам, поэтому все мои преобразования будут на уровне строк, а не на уровне фреймов данных.
//Read stream
val df = spark
.readStream
.format("kafka")
.options(kafkaParams)
.load()
//Tried below on dataframe level, not working(probably because each row might have different set of columns that are not null?).
val tf_df = df.select(df.columns.filter(!col(_).equals(null)).map(df(_)) : _*)
//Then I decided to do the transformation while writing the stream.
enter code here
val cassandraUpdater = tf_df
.writeStream
.queryName("updateCassandra")
.outputMode("update")
.foreach(new CassandraUpdater(spark))
.start()
cassandraUpdater.awaitTermination()
И мой CassandraUpdater является классом, расширяющим ForeachWriter [org.apache.spark.sql.Row] и пытается выполнить преобразования строк перед записью его в Cassandra.
Итак, теперь, возвращаясь к исходному вопросу, у меня есть строка искры x (тип: org.apache.spark.sql.Row), и я хочу преобразовать в другую искру y со всеми удаленными пустыми столбцами,Я попытался преобразовать строку искры в Map [String, Any] и удалить нулевые значения, но затем я теряю схему, и она тоже не кажется эффективной.
Итак, если у меня есть строка x: org.apache.spark.sql.Row = [null, 1549861200001, null, 23, null, «asd», null, null]
Я бы хотел, чтобы y было: org.apache.spark.sql.Row = [1549861200001,23, "asd"]
Заранее спасибо.