我从“ 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()
因为它写在代码下面的某处:
分组集取决于聚合级别的空值。如果你这样做 不过滤掉空值,您将得到不正确的结果。 适用于多维数据集,汇总和分组集。
答案 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中也不会发生任何变化。