与spark dataframe`withColumn`方法相反?

时间:2019-04-11 19:58:46

标签: apache-spark apache-spark-sql

我希望能够在我的DataFrame上链接一个删除列的转换,而不是将DataFrame分配给变量(即df.drop())。如果要添加一列,我可以简单地调用df.withColumn()。在转换的串联链中删除列的方法是什么?

1 个答案:

答案 0 :(得分:0)

对于整个示例,将其用作基准:

val testVariable = 10
var finalDF = spark.sql("'test' as test_column")

val iDF = spark.sql("select 'John Smith' as Name, cast('10' as integer) as Age, 'Illinois' as State")
val iDF2 = spark.sql("select 'Jane Doe' as Name, cast('40' as integer) as Age, 'Iowa' as State")
val iDF3 = spark.sql("select 'Blobby' as Name, cast('150' as integer) as Age, 'Non-US' as State")
val nameDF = iDF.unionAll(iDF2).unionAll(iDF3)

1个有条件掉落 如果只想丢弃某些输出并且这些是已知输出,则可以构建条件循环以检查是否需要丢弃迭代器。在这种情况下,如果测试变量超过4,它将删除名称列,否则将添加新列。

finalDF = if (testVariable>=5) {
  nameDF.drop("Name")
} else {
  nameDF.withColumn("Cooler_Name", lit("Cool_Name")
}

finalDF.printSchema

2以编程方式构建select语句。选择表达式语句的基线采用独立的字符串,并将其构建为Spark可以读取的命令。在以下情况下,我们知道我们已经进行了删除测试,但是我们知道哪些列可能被删除。在这种情况下,如果列获得的测试值不等于1,则我们不会将该值包括在out命令数组中。当我们对表上的select表达式运行命令数组时,这些列将被删除。

val columnNames = nameDF.columns
val arrayTestOutput = Array(1,0,1)
var iteratorArray = 1
var commandArray = Array("")
while(iteratorArray <= columnNames.length) {
  if (arrayTestOutput(iteratorArray-1) == 1) {
    if (iteratorArray == 1) {
      commandArray = columnNames(iteratorArray-1)
    } else {
      commandArray = commandArray ++ columnNames(iteratorArray-1)
    }
  }
  iteratorArray = iteratorArray + 1
}
finalDF=nameDF.selectExpr(commandArray:_*)
finalDF.printSchema