2016-10-26 2 views
4

Я создал rdd из файла csv, а первая строка - строка заголовка в этом CSV-файле. Теперь я хочу создать dataframe из этого rdd и сохранить столбец из 1-го элемента rdd.RDD to DataFrame в pyspark (столбцы из первого элемента rdd)

Проблема: я могу создать dataframe и с столбцом из rdd.first(), но созданный dataframe имеет первую строку в качестве самих заголовков. Как удалить это?

lines = sc.textFile('/path/data.csv') 
rdd = lines.map(lambda x: x.split('#####')) ###multiple char sep can be there #### or #@# , so can't directly read csv to a dataframe 
#rdd: [[u'mailid', u'age', u'address'], [u'satya', u'23', u'Mumbai'], [u'abc', u'27', u'Goa']] ###first element is the header 
df = rdd.toDF(rdd.first()) ###retaing te column from rdd.first() 
df.show() 
#mailid age address 
mailid age address ####I don't want this as dataframe data 
satya 23 Mumbai 
abc  27 Goa 

Как избежать того, чтобы первый элемент перемещался к данным dataframe. Могу ли я дать какой-либо вариант в rdd.toDF (rdd.first()), чтобы это сделать?

Примечание: Я не могу собрать RDD, чтобы сформировать список, а затем удалить первый элемент из этого списка, а затем распараллелить этот список обратно, чтобы сформировать RDD, а затем снова toDF() ...

Пожалуйста, предложите !!! Спасибо

+0

почему вы не читали его в формате CSV как DataFrame напрямую? – eliasah

+1

@ eliasah- Spark не может читать файлы с более чем одним символьным разделителем (например, ##### или # @ #), чтобы сформировать dataframe с помощью (spark.read.csv или databricks csv package), и у меня есть такой вид файлы для чтения. – Satya

+0

, так что удалите заголовок перед преобразованием вашего rdd в DF. Плюс в вашем вопросе разделитель - это труба. Так что не угадайте проблему «более одного символа-разделителя» – eliasah

ответ

5

Вам нужно будет удалить заголовок с RDD. Один из способов сделать это заключается в следующем учитывая вашу rdd переменную:

>>> header = rdd.first() 
>>> header 
# ['mailid', 'age', 'address'] 
>>> data = rdd.filter(lambda row : row != header).toDF(header) 
>>> data.show() 
# +------+---+-------+ 
# |mailid|age|address| 
# +------+---+-------+ 
# | satya| 23| Mumbai| 
# | abc| 27| Goa| 
# +------+---+-------+