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

txu3uszq  于 2021-06-24  发布在  Hive
关注(0)|答案(4)|浏览(330)

我正在读取一个文本(不是csv)文件,该文件使用

spark.read.format("text").option("delimiter","|")...load(file)

我可以用 df.first() . 有什么接近的吗 df.last() 或者 df.reverse().first() ?

vx6bjr1n

vx6bjr1n1#

假设你的文本文件有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>}]

希望有帮助。

yi0zb3m4

yi0zb3m42#

样本数据:

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|
+----+-----+------+

希望这有帮助!

3okqufwl

3okqufwl3#

除了上面的答案,下面 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)

希望这有帮助。

k4aesqcs

k4aesqcs4#

假设文件不是那么大,我们可以使用collect以迭代器的形式获取Dataframe,并访问最后一个元素,如下所示:

df = df.collect()[data.count()-1]

避免使用 collect 在大型数据集上。

我们可以用take把最后一排剪掉。

df = df.take(data.count()-1)

相关问题