当DataFrame调用不带参数的drop()时,这是什么意思?

时间:2019-06-01 09:07:09

标签: scala apache-spark

我从“ Spark The Definitive Guide”一书中看到了一个代码,当我使用show()时,它调用了一个没有参数的数据框,但没有发现任何变化,但是它的含义是什么?

我执行它,没有做任何更改,dfNoNull.show()与dfWithDate.show()相同

dfWithDate.createOrReplaceTempView("dfWithDate")
// in Scala
val dfNoNull = dfWithDate.drop()
dfNoNull.createOrReplaceTempView("dfNoNull")

这是否意味着它会创建一个新的datarframe? 我知道当我使用Hive sql时,数据框何时加入自身

val df1=spark.sql("select id,date from date")
val df2=spark.sql("select id,date from date")
val joinedDf = spark.sql("select dateid1,dateid2 from sales")
.join(df1,df1["id"]===dateid1).join(df2,df2["id"]===dateid2)

然后发生错误:笛卡尔加入! 因为懒惰评估会将df1和df1视为同一

如果我在这里

val df2=df1.drop()

我可以防止该错误吗?

如果没有,没有参数的drop方法意味着什么?

还是只是删除临时视图名称并创建一个新名称?

但是我尝试下面的代码,没有抛出异常:

   val df=  Seq((1,"a")).toDF("id","name")
   df.createOrReplaceTempView("df1")
   val df2=df.drop()
    df2.createOrReplaceTempView("df2")
    spark.sql("select * from df1").show()

或者这本书的意思在下面?

 val dfNoNull = dfWithDate.na.drop()

因为它写在代码下面的某处:

  

分组集取决于聚合级别的空值。如果你这样做   不过滤掉空值,您将得到不正确的结果。   适用于多维数据集,汇总和分组集。

1 个答案:

答案 0 :(得分:2)

没有参数的

drop函数的行为与Dataframe中不存在的具有列名的drop相同。 您可以遵循spark来源中的代码。

即使在功能文档中,您也可以看到此行为的提示。

  /**
   * Returns a new Dataset with a column dropped. This is a no-op if schema doesn't contain
   * column name.
   *
   * This method can only be used to drop top level columns. the colName string is treated
   * literally without further interpretation.
   *
   * @group untypedrel
   * @since 2.0.0
   */

因此,在不带参数的情况下调用函数时,不会发生操作,返回的DataFrame中也不会发生任何变化。