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

pyspark - 使用 RDD 进行聚合比 DataFrame 快得多

pyspark 行列表的 RDD 到 DataFrame

Pyspark RDD 到具有强制模式的 DataFrame:值错误

python - 如何将密集向量的RDD转换为pyspark中的DataFrame?