【发布时间】: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