在pyspark中将RDD转换为DataFrame(从RDD的第一个元素中获取列)

4
我已从CSV文件创建了RDD,该文件的第一行是标题行。现在我想从该RDD创建DataFrame,并保留来自RDD的第一个元素的列。
问题是我能够创建包含rdd.first()列的DataFrame,但所创建的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

如何避免第一个元素移动到数据帧数据中。 我能否在rdd.toDF(rdd.first())中提供任何选项来完成这项工作?请注意:我无法收集rdd以形成列表,然后从该列表中删除第一个项目,然后将该列表并行化以再次形成rdd,然后toDF()... 请建议!!! 谢谢

为什么不直接将它作为DataFrame以CSV格式读取呢? - eliasah
1
@eliasah - Spark无法读取使用多个字符分隔符(例如#####或#@#)的文件,以便通过spark.read.csv或databricks csv软件包形成数据框。 我也有这种类型的文件需要读取。 - Satya
在将RDD转换为DF之前,请删除标题。另外,在您的问题中,分隔符是管道符号。因此,不会出现“多个字符分隔符”的问题。 - eliasah
我提出了一个问题,以获得任何通用解决方案来实现它。正如我所提到的,文件中可能会有多个分隔符。而且文件是动态生成的,所以如果我删除它,可能无法从我的程序中保留列名(虽然我可以保存在记事本中并将其放置在控制台中)。为了通用化,如果您有任何建议,请提出建议。我编辑了分隔符,因此不会产生“无法直接读取到数据框架”的混淆。 - Satya
1个回答

8
您需要从您的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|
# +------+---+-------+ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接