Spark(Scala):如何将数组[Row]转换为DataSet [Row]或DataFrame?

时间:2016-11-21 05:15:10

标签: scala apache-spark apache-spark-sql spark-streaming

我有一个数组[行],我想把它变成Dataset[Row]DataFrame

我是如何想出一系列行的?

好吧,我试图清除数据集中的空值:

  • 没有必须过滤EACH列(我有很多)和..
  • 没有使用.na.drop()中的DataFrameNaFunctions函数,因为它无法检测到某个单元格实际上何时有字符串"null"

所以,我想出了以下一行来过滤掉所有列中的null

val outDF = inputDF.columns.flatMap { col => inputDF.filter(col + "!='' AND " + col + "!='null'").collect() }

问题是,outDF是Array[Row],因此问题!欢迎任何想法!

3 个答案:

答案 0 :(得分:3)

这是你的代码如果有效的话会做的事情:

inputDF.columns.map {
  col => inputDF.filter((inputDF(col) =!= "") and (inputDF(col) =!= "null"))
}.reduce(_ union _)

等等:

inputDF.where(inputDF.columns.map {
  col => (inputDF(col) =!= "") and (inputDF(col) =!= "null")
}.foldLeft(lit(true))(_ and _))

是你想要的。

请注意,第一个解决方案使用以下数据创建非独占子集:

val inputDF = Seq(("1", "a"), ("2", ""), ("null", "")).toDF

结果将是:

+---+---+
| _1| _2|
+---+---+
|  1|  a|
|  2|   |
|  1|  a|
+---+---+

对于我认为正确的解决方案:

+---+---+
| _1| _2|
+---+---+
|  1|  a|
+---+---+

答案 1 :(得分:3)

我根据我的评论发布了答案。

df.na.drop(df.columns).where("'null' not in ("+df.columns.mkString(",")+")")

答案 2 :(得分:0)

根据Srinivas先生的评论,使用以下代码回答了这个问题:

//First drop all typical nulls
val prelimDF = inputDF.na.drop()

//Then drops all columns actually saying 'null'
val finalDF = prelimDF.na.drop(prelimDF.columns).where("'null' not in ("+prelimDF.columns.mkString(",")+")")

干杯!