Мне нужно читать файлы от поставщиков, которые могут стать довольно большими (несколько ГБ). Эти файлы могут иметь несколько строк верхнего и нижнего колонтитула, которые я хочу удалить.
Считать файл очень просто:
val rawData = spark.read
.format("csv")
.option("delimiter","|")
.option("mode","PERMISSIVE")
.schema(schema)
.load("/path/to/file.csv")
Я могу добавить простой номер строки, используя monotonically_increasing_id:
val withRN = rawData.withColumn("aIndex",monotonically_increasing_id())
Кажется, что работает нормально.
Я могу легко использовать это для удаления строк заголовка:
val noHeader = withRN.filter($"aIndex".geq(2))
но как я могу удалить строки нижнего колонтитула?
Я думал о том, чтобы получить максимум столбца индекса и использовать его в качестве фильтра, но я не могу заставить это работать.
val MaxRN = withRN.agg(max($"aIndex")).first.toString
val noFooter = noHeader.filter($"aIndex".leq(MaxRN))
Это не возвращает строк, потому что MaxRN является строкой. Если я попытаюсь преобразовать его в long, то произойдет сбой:
noHeader.filter($"aIndex".leq(MaxRN.toLong))
java.lang.NumberFormatException: For input string: "[100000]"
Как я могу использовать это максимальное значение в фильтре? Попытка использовать monotonically_increasing_id как этот даже жизнеспособный подход? Это действительно детерминистично?