противоположность искровому методу данных с помощью метода withColumn? - PullRequest
0 голосов
/ 11 апреля 2019

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

1 Ответ

0 голосов
/ 12 апреля 2019

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...