Spark - прочитать текстовый файл, зачеркнуть первые X и последние Y строки, используя monotonically_increasing_id - PullRequest
1 голос
/ 31 октября 2019

Мне нужно читать файлы от поставщиков, которые могут стать довольно большими (несколько ГБ). Эти файлы могут иметь несколько строк верхнего и нижнего колонтитула, которые я хочу удалить.

Считать файл очень просто:

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 как этот даже жизнеспособный подход? Это действительно детерминистично?

1 Ответ

1 голос
/ 31 октября 2019

Это происходит потому, что first вернет строку . Чтобы получить доступ к первому элементу строки, вы должны сделать:

val MaxRN = withRN.agg(max($"aIndex")).first.getLong(0)

Преобразовав строку в строку, вы получите [100000] и, конечно, это недопустимый Long, поэтому приведение не удается,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...