2016-10-26 3 views
4

csv 파일에서 rdd를 만들었으며 첫 번째 행이 해당 csv 파일의 헤더 행입니다. 이제 그 rdd에서 데이터 프레임을 만들고 rdd의 첫 번째 요소에서 열을 유지하려고합니다.pyspark의 RDD to 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를 수집 할 수 없습니다, 다음

제안하십시오 ... 다시 다음 toDF을() RDD를 형성하기 위해 다시 그 목록을 병렬화! 감사합니다

+0

DataFrame으로 CSV 형식으로 직접 읽지 않는 이유는 무엇입니까? – 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| 
# +------+---+-------+ 
관련 문제