因此,我有一个火花行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”]
先谢谢了。