pyspark中的RDD到DataFrame(来自rdd的第一个元素的列)
Posted
技术标签:
【中文标题】pyspark中的RDD到DataFrame(来自rdd的第一个元素的列)【英文标题】:RDD to DataFrame in pyspark (columns from rdd's first element) 【发布时间】:2016-10-26 06:26:17 【问题描述】:我从 csv 文件创建了一个 rdd,第一行是该 csv 文件中的标题行。现在我想从该 rdd 创建数据框并保留 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 以形成 list ,然后从该列表中删除第一项,然后将该列表并行化回再次形成 rdd 然后 toDF()...
请推荐!!!谢谢
【问题讨论】:
为什么不直接把它读成 CSV 格式的 DataFrame 呢? @eliasah- Spark 无法读取具有多个字符分隔符(如 ##### 或 #@#)的文件以通过 (spark.read.csv 或 databricks csv 包形成数据帧) 而且我也有这类文件要阅读。 所以在将您的 rdd 转换为 DF 之前删除标题。另外,在您的问题中,分隔符是一个管道。所以不会猜到“多个字符分隔符”的问题 我问了一个问题,以获得任何通用的解决方案来实现这一目标。正如我提到的,有些文件可以有多个 sep 。而且文件是动态生成的,所以如果我删除它,我可能无法从我的程序中保留列名(尽管我可以保存在记事本中并将其放在控制台中)。如果您有任何建议,请提出建议。我编辑了 sep,所以对“这不能直接读取到数据框”没有混淆。 【参考方案1】:您必须从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|
# +------+---+-------+
【讨论】:
以上是关于pyspark中的RDD到DataFrame(来自rdd的第一个元素的列)的主要内容,如果未能解决你的问题,请参考以下文章
为每组 pyspark RDD/dataframe 选择随机列
pyspark - 使用 RDD 进行聚合比 DataFrame 快得多