【问题标题】:RDD to DataFrame in pyspark (columns from rdd's first element)pyspark中的RDD到DataFrame(来自rdd的第一个元素的列)
【发布时间】: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,所以对“这不能直接读取到数据框”没有混淆。

标签: python-2.7 apache-spark pyspark rdd pyspark-sql


【解决方案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|
# +------+---+-------+ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    相关资源
    最近更新 更多