现在我想创建一个新的数据框架或rdd,其中只有行downloadUrl和title不为空。

  df.map(row=>{
    // here I want to see if the downloadUrl is null
    // do something
    // else if the title is null
    // do something
    // else
    // create a new dataframe df1 with a new column "allowed" with the value set to 1 
    // push df1 to API
    
1 个评论
如果你不打算在map方法中使用外部scala库,最好是使用数据框API。这样会快得多,而且Spark可以对其进行优化。
scala
apache-spark
apache-spark-sql
ab AL
ab AL
发布于 2022-02-03
1 个回答
okmich
okmich
发布于 2022-02-03
已采纳
0 人赞同
  df.map(row=>{
    // here I want to see if the downloadUrl is null
    // do something
    // else if the title is null
    // do something
    // else
    // create a new dataframe df1 with a new column "allowed" with the value set to 1 
    // push df1 to API

不知道你说的是什么意思 如果title/downloadUrl为空,则做一些事情

但如果你想要一个新的数据框架,其中只有downloadUrl和title两行不为空。请尝试使用这个数据集方法

case class MyObject(id:Int, downloadUrl: String, title: String)
val df = spark.read.json("C:\\filepath\\file.json").as[MyObject]
val df1 = df.filter(o => o.downloadUrl =! null && o.title != null)

另一种方法是使用下面的过滤器函数

val df1 = df.filter(row=>{
    val downloadUrl = row.getAs[String]("downloadUrl")
    val title = row.getAs[String]("title")
    // here I want to see if the downloadUrl is null
    // do something
    // else if the title is null
    // do something
    // else
    // create a new dataframe df1 with a new column "allowed" with the value set to 1 
    return title != null && downloadUrl != null

最后,如果你想把到达的行推送给外部API,使用foreach each来代替。然后使用谓词来确定该行是否应该被推送。

  df.foreach(row=>{
    val downloadUrl = row.getAs[String]("downloadUrl")
    val title = row.getAs[String]("title")
    // here I want to see if the downloadUrl is null
    // do something
    // else if the title is null
    // do something
    // else
    // create a new dataframe df1 with a new column "allowed" with the value set to 1 
    if (title != null && downloadUrl != null){