Удаление столбцов на основе их типов данных из фрейма искры в scala - PullRequest
0 голосов
/ 02 марта 2020

У меня есть DataFrame со следующей схемой:

root<br>
 |-- id:  string <br>
 |-- destinationCity: struct (nullable = true)<br>
 |    |-- areaNumber: string (nullable = true)<br>
 |    |-- cityCode: string (nullable = true)<br>
 |    |-- countryCode: string (nullable = true)<br>
 |    |-- fileDetails: struct (nullable = true)<br>
 |    |    |-- fileName: string (nullable = true)<br>
 |    |-- timeSeries: struct (nullable = true)<br>
 |    |    |-- createdTimeStamp: struct (nullable = true)<br>
 |    |    |-- effectiveTimeStamp: struct (nullable = true)<br>
 |    |    |-- expiryTimeStamp: struct (nullable = true)<br>
 |    |    |-- lastUpdatedTimeStamp: struct (nullable = true)<br>

При записи фрейма данных этой схемы в файл паркета он выдает ошибку, т. Е. Пустая вложенная схема не может быть записано в виде файла паркета.

Поэтому мне пришлось удалить столбец timeSeries из кадра данных, поскольку тип структуры данных его поля не выводится из контекста

df.drop("timeSeries").write.parquet("output")

Выше кода сработало.
Теперь я хочу разработать обобщенный подход для отбрасывания всех тех столбцов, которые находятся в leaf дерева схемы и имеют struct в качестве Типа данных.

Как пройти через вложенные столбцы и проверить на листовой узел?

1 Ответ

0 голосов
/ 02 марта 2020

Попробуйте таким образом, выберите имена столбцов, отфильтровав их из схемы, и отбросьте все.

import org.apache.spark.sql.types._
val selectCols = df.schema.fields.filter(x => x.dataType.typeName == "struct").map(x => x.name)
val resultDF = df.drop(selectCols: _*)
...