如何从数据框中删除页眉和页脚?
Posted
技术标签:
【中文标题】如何从数据框中删除页眉和页脚?【英文标题】:How to Remove header and footer from Dataframe? 【发布时间】:2017-11-05 21:41:28 【问题描述】:我正在阅读一个包含页眉、内容和页脚的文本(不是 CSV)文件
spark.read.format("text").option("delimiter","|")...load(file)
我可以使用df.first()
访问标题。 df.last()
或 df.reverse().first()
附近有什么东西吗?
【问题讨论】:
我认为最有效的方法不是火花。我会在预处理步骤中使用 shell 脚本来完成。这里有一些想法:***.com/questions/4193817/… 【参考方案1】:样本数据:
col1|col2|col3
100|hello|asdf
300|hi|abc
200|bye|xyz
800|ciao|qwerty
This is the footer line
处理逻辑:
#load text file
txt = sc.textFile("path_to_above_sample_data_text_file.txt")
#remove header
header = txt.first()
txt = txt.filter(lambda line: line != header)
#remove footer
txt = txt.map(lambda line: line.split("|"))\
.filter(lambda line: len(line)>1)
#convert to dataframe
df=txt.toDF(header.split("|"))
df.show()
输出是:
+----+-----+------+
|col1| col2| col3|
+----+-----+------+
| 100|hello| asdf|
| 300| hi| abc|
| 200| bye| xyz|
| 800| ciao|qwerty|
+----+-----+------+
【讨论】:
【参考方案2】:假设文件不是很大,我们可以使用 collect 来获取 dataframe 作为迭代器并访问最后一个元素,如下所示:
df = df.collect()[data.count()-1]
避免在大型数据集上使用collect
。
或
我们可以使用 take 来截断最后一行。
df = df.take(data.count()-1)
【讨论】:
【参考方案3】:假设您的文本文件有 JSON 页眉和页脚, Spark SQL方式,
样本数据
"":[<field_name>:<field_value1>,<field_name>:<field_value2>]
这里的标题可以通过以下 3 行来避免(假设数据中没有 Tilda),
jsonToCsvDF=spark.read.format("com.databricks.spark.csv").option("delimiter", "~").load(<Blob Path1/ ADLS Path1>)
jsonToCsvDF.createOrReplaceTempView("json_to_csv")
spark.sql("SELECT SUBSTR(`_c0`,5,length(`_c0`)-5) FROM json_to_csv").coalesce(1).write.option("header",false).mode("overwrite").text(<Blob Path2/ ADLS Path2>)
现在输出看起来像,
[<field_name>:<field_value1>,<field_name>:<field_value2>]
【讨论】:
【参考方案4】:除了上面的答案,下面solution fits good
的文件有multiple
header
和footer
行:-
val data_delimiter = "|"
val skipHeaderLines = 5
val skipHeaderLines = 3
//-- Read file into Dataframe and convert to RDD
val dataframe = spark.read.option("wholeFile", true).option("delimiter",data_delimiter).csv(s"hdfs://$in_data_file")
val rdd = dataframe.rdd
//-- RDD without header and footer
val dfRdd = rdd.zipWithIndex().filter(case (line, index) => index != (cnt - skipFooterLines) && index > (skipHeaderLines - 1)).map(case (line, index) => line)
//-- Dataframe without header and footer
val df = spark.createDataFrame(dfRdd, dataframe.schema)
【讨论】:
以上是关于如何从数据框中删除页眉和页脚?的主要内容,如果未能解决你的问题,请参考以下文章