противоположность методу spark dataframe `withColumn`?

#apache-spark #apache-spark-sql

#apache-spark #apache-spark-sql

Вопрос:

Я хотел бы иметь возможность связать преобразование в my DataFrame , которое удаляет столбец, а не присваивать DataFrame переменной (т.Е. df.drop() ). Если бы я хотел добавить столбец, я мог бы просто позвонить df.withColumn() . Каков способ удаления столбца во встроенной цепочке преобразований?

Комментарии:

1. Можете ли вы добавить пример, в котором drop не работает противоположность withColumn ? Вы должны иметь возможность использовать его внутри цепочки преобразований.

2. lol да, хорошо, это работает

Ответ №1:

Для всего примера используйте это в качестве базовой линии:

 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, столбец name будет удален, иначе он добавит новый столбец.

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

finalDF.printSchema
  

2 Программно создайте оператор select. Базовый оператор выражения select принимает независимые строки и преобразует их в команды, которые могут быть прочитаны Spark. В приведенном ниже случае мы знаем, что у нас есть тест на удаление, но мы знаем, какие столбцы могут быть удалены. В этом случае, если столбец получает тестовые значения, которые не равны 1, мы не включаем значение в массив out command. Когда мы запускаем команду array для выражения 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
  

Комментарии:

1. действительно задействовано, но я просто ищу замену, т.е. dataFrame.withoutColumn(...

2. Вы ищете что-то вроде nameDF.selectExpr(«*», «длина (имя) как Length_Name»).drop(«Name»).withColumn(«Name»,lit(«No_Name»))?

3. Не требуется предложение «FROM t» в spark.sql() методе?

4. @peter он будет внутренне генерировать значения, это дешевый и дрянной способ генерации тестовых данных соответствующей структуры без выполнения серии структурных команд.

5. @afeldman, в этом случае «дешевый и дрянной способ» кажется Seq(("John Smith", 10, "Illinois")).toDF("Name","Age","State")