Я хочу создать конвейер обработки данных в AWS, чтобы в конечном итоге использовать обработанные данные для Machine Learning.
У меня есть Scala-скрипт, который берет необработанные данные из S3, обрабатывает его и записывает в HDFS или даже S3 с помощью Spark-CSV. Я думаю, что я могу использовать несколько файлов в качестве входных данных, если я хочу использовать инструмент AWS Machine Learning для обучения модели прогнозирования. Но если я хочу использовать что-то еще, я полагаю, что лучше всего получить один выходной файл CSV.
В настоящее время, поскольку я не хочу использовать перераспределение (1) и не объединять (1) для целей производительности, я использовал hadoop fs -getmerge для ручного тестирования, но поскольку он просто сливает содержимое выходных файлов задания, я запускаю в маленькую проблему. Мне нужна одна строка заголовков в файле данных для обучения модели прогнозирования.
Если я использую .option("header","true")
для spark-csv, тогда он записывает заголовки в каждый выходной файл, и после слияния у меня есть столько строк заголовков в данных, сколько есть выходных файлов. Но если параметр заголовка является ложным, то он не добавляет заголовков.
Теперь я нашел вариант слияния файлов внутри скрипта Scala с API-интерфейсом Hadoop FileUtil.copyMerge
. Я попробовал это в spark-shell
с помощью кода ниже.
import org.apache.hadoop.fs.FileUtil
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
val configuration = new Configuration();
val fs = FileSystem.get(configuration);
FileUtil.copyMerge(fs, new Path("smallheaders"), fs, new Path("/home/hadoop/smallheaders2"), false, configuration, "")
Но это решение по-прежнему просто объединяет файлы друг с другом и не обрабатывает заголовки. Как я могу получить выходной файл только с одной строкой заголовков?
Я даже попытался добавить df.columns.mkString(",")
в качестве последнего аргумента для copyMerge
, но это добавило заголовки еще несколько раз, а не один раз.