Spark和Scala:如何从Rdd或数据框中删除空行?

时间:2018-12-13 20:12:12

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

我在scala上使用spark.Rdd中有一些空行。我需要将它们从Rdd中删除。

我尝试了:

val valfilteredRow = rddRow.filter(row => row!=null && row.length>0)

但是它不起作用。

Rdd中的行看起来像[带有:valfilteredRow.collect()。foreach(println)]:

[,AAGGOO]
[,AAAOOO]
[,GGGGGII]
[]
[,UGGG]

3 个答案:

答案 0 :(得分:1)

假设您具有以下顺序:

val seq = Seq(
  ",AAGGOO",
  ",AAAOOO",
  ",GGGGGII",
  "",
  ",UGGG"
)

使用DF

  val df = seq.toDF("Column_name")

  df.show(false)

+--------------+
|Column_name   |
+--------------+
|,AAGGOO       |
|,AAAOOO       |
|,GGGGGII      |
|              |
|,UGGG         |
+--------------+

  df.filter(row => !(row.mkString("").isEmpty && row.length>0)).show(false)

+--------------+
|Column_name   |
+--------------+
|,AAGGOO       |
|,AAAOOO       |
|,GGGGGII      |
|,UGGG         |
+--------------+

使用rdd

  val rdd = sc.parallelize(seq)

  val filteredRdd = rdd.filter(row => !row.isEmpty)

  filteredRdd.foreach(println)

,AAGGOO
,AAAOOO
,GGGGGII
,UGGG

答案 1 :(得分:1)

如果您的RDD类型为RDD[String],那么您可以这样做

rdd.filter(_.length>0).collect

答案 2 :(得分:1)

我不了解Scala,但这是我在Pyspark中所做的事情

假设您有一个输入文件,例如:

Banana,23,Male,5,11,2017

Dragon,28,Male,1,11,2017
Dragon,28,Male,1,11,2017

第二行为空。

rdd = sc.textFile(PATH_TO_FILE).mapPartitions(lambda line: csv.reader(line,delimiter=','))

>>> rdd.take(10)
[['Banana', '23', 'Male', '5', '11', '2017'], [], ['Dragon', '28', 'Male', '1', '11', '2017'], ['Dragon', '28', 'Male', '1', '11', '2017']]

您会看到第二个元素为空,因此我们将通过计算元素的长度对其进行过滤,该长度应大于1。

>>> rdd = sc.textFile(PATH_TO_FILE).mapPartitions(lambda line: csv.reader(line,delimiter=',')).filter(lambda line: len(line) > 1)
>>> rdd.take(10)
[['Banana', '23', 'Male', '5', '11', '2017'], ['Dragon', '28', 'Male', '1', '11', '2017'], ['Dragon', '28', 'Male', '1', '11', '2017']]