如何从数据框中删除页眉和页脚?

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 headerfooter 行:-

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)

【讨论】:

以上是关于如何从数据框中删除页眉和页脚?的主要内容,如果未能解决你的问题,请参考以下文章

从嵌入应用程序的内框架中删除网站页眉和页脚

需要从本地 iframe 中的 src url 中删除页眉和页脚

RegEx 删除密钥和证书页眉和页脚 [重复]

在 Elementor 中删除页眉和页脚

更改或删除 TCPDF 中的页眉和页脚

从打印页面禁用浏览器特定的页眉和页脚