【问题标题】:remove rows with empty values - Spark Scala删除具有空值的行 - Spark Scala
【发布时间】:2020-05-23 04:26:24
【问题描述】:

我是 Scala 和 Spark 的新手。我正在尝试做一些简单的程序,我想删除具有空/空值的行(不使用 DataFrame)。 我试图用过滤器来做,但它不起作用。你能告诉我哪里出错了吗?

数据:

Bypass Road (film),2019,137,Drama|Thriller,7.1,51
Satellite Shankar,2019,135,Action|Drama,4.6,34
Jhalki,2019,0,Drama,,
Marjaavaan,2019,0,Action|Romance,,
Motichoor Chaknachoor,2019,150,Comedy|Romance,,
Keep Safe Distance (film),2019,0,Action|Thriller,,

我正在尝试删除具有空值的行,例如 Keep Safe Distance (film),2019,0,Action|Thriller,,

代码:

val sparkSession = SparkSession.builder().appName("MovieAnalyzer")
      .master("local")
      .getOrCreate()

    val dataRDD = sparkSession.sparkContext.textFile("src/test/resources/movies.csv")

    // remove the header
    val header = dataRDD.first()
    val movie_list = dataRDD.filter(line => line != header).filter(r => !r.contains("")).map(r => r.replace("\\N","0"))
    movie_list.collect().foreach(println)

上面的代码没有打印 csv 文件中的任何数据。请让我知道我的代码有什么问题

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    问题在于 .filter(r => !r.contains(""))

    您应该拆分这些值,然后执行检查:

    dataRDD.filter(s=> !s.split(",",-1).contains("")).foreach(println(_))

    所以输出将是:

    Bypass Road (film),2019,137,Drama|Thriller,7.1,51 Satellite Shankar,2019,135,Action|Drama,4.6,34

    如果不需要RDD,我会使用DataFrame,然后使用DataFrameNaFunctions,如下所示:

    val df = ss.read.csv("data/movies.csv")
    df.na.drop().show();
    

    输出:

    +------------------+----+---+--------------+---+---+
    |               _c0| _c1|_c2|           _c3|_c4|_c5|
    +------------------+----+---+--------------+---+---+
    |Bypass Road (film)|2019|137|Drama|Thriller|7.1| 51|
    | Satellite Shankar|2019|135|  Action|Drama|4.6| 34|
    +------------------+----+---+--------------+---+---+
    

    【讨论】:

    • 感谢它的工作。你能解释一下为什么代码没有。我的代码有什么问题?
    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多