2016-10-26 79 views
4

我已經從csv文件創建了一個rdd,第一行是該csv文件中的標題行。現在我想從該rdd創建數據框並保留rdd第一個元素的列。RDD到pyspark中的DataFrame(來自rdd的第一個元素的列)

問題是我能夠創建數據幀和rdd.first()的列,但創建的數據幀的第一行是頭本身。如何刪除?

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 

如何避免第一個元素移動到數據幀數據。我可以在rdd.toDF(rdd.first())中給出任何選項來完成此操作嗎?

注:我不能收集RDD形成列表,然後從列表中刪除第一個項目,然後並行化列表回再次然後形成RDD toDF()...

請建議!謝謝

+0

你爲什麼不讀它以CSV格式直接一個數據幀:這樣做是下列考慮您的rdd變量的一種方式? – eliasah

+1

@ eliasah- Spark不能通過(spark.read.csv或databricks csv包)來讀取具有多個字符分隔符(如#####或#@#)的文件以形成數據框,並且我有這樣的文件也可以讀取。 – Satya

+0

因此,在將rdd轉換爲DF之前刪除標題。另外在你的問題中,分隔符是一個管道。所以不會猜測「多個字符分隔符」問題 – eliasah

回答

5

您將不得不從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| 
# +------+---+-------+