我希望能够在我的DataFrame
上链接一个删除列的转换,而不是将DataFrame
分配给一个变量(即 df.drop()
(。 如果我想添加一列,我可以简单地调用df.withColumn()
. 在内联转换链中删除列的方法是什么?
对于整个示例,请使用此作为基线:
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 命令数组中包含该值。当我们对表上的选择表达式运行命令数组时,这些列将被删除。
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