从火花行中选择非空列

时间:2019-02-15 02:52:39

标签: apache-spark apache-spark-sql spark-streaming spark-cassandra-connector

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

先谢谢了。

0 个答案:

没有答案