2015-10-07 2 views
2

Я новичок в Spark и пытаюсь прочитать файл csv и получить первый и второй столбцы в файле. Дело в том, что файл csv огромен, и мне не интересно разбирать каждую строку в файле csv. Кроме того, запуск функции collect() может привести к сбою процесса, потому что памяти может быть недостаточно для поддержки объема возвращаемых данных. Поэтому мне было интересно, можно ли создать RDD только с подмножеством данных csv. Например, возможно ли создать RDD, содержащий строки от 10 до 1000 из файла csv, и игнорировать другие строки.Как получить подмножество csv-файла как Spark RDD

Прямо сейчас, все у меня есть

csvdata = sc.textFile("hdfs://nn:port/datasets/sample.csv").map(lambda line: line.split(",")) 

Это в основном создает RDD для всего файла CSV. Возможно ли создать RDD из csvdata, содержащих строки от 10 до 1000?

Большое спасибо за предоставленную помощь.

+0

http://stackoverflow.com/questions/15644859/how-to-read-specific-part-of-large-file-in-python – Ashalynd

ответ

2

Вы можете загрузить все и фильтр по индексу:

rdd = sc.parallelize(range(0, -10000, -1)) 
rdd.zipWithIndex().filter(lambda kv: 9 <= kv[1] < 999).keys() 

Настройка диапазонов в зависимости от того, как вы определяете 10-й линии.

+0

Это работает. Мне нужно было заменить функцию parallelize() в вашем ответе на textFile(), и она сработала. Большое спасибо. – thisisshantzz

0

RDD - это не данные, хранящиеся в памяти, это намерение работать над некоторыми данными. Когда вы вызываете операцию терминала, например «собираете» или «уменьшаете», Spark обрабатывает данные. Spark делает некоторую умную оптимизацию под капотом, которая ограничивает объем работы, которую она должна выполнять, основываясь на истории ваших операций на RDD.

(попробуйте сами, вызвав некоторые операции РДУ, но не называя работу терминала. Ничего не происходит!)

Так что вы можете сделать, например, (Это Scala, но не слишком отличается в питоне)

val first10results: Array[Array[String]] = sc.textFile(filePath) 
     .map(f => f.split(",")) 
     .take(10) 

Спарк будет знать, из-за take(10), что вы хотите только первые 10 строк. Так что это займет всего 10 строк из файла! Просто.

Смежные вопросы