在 Spark 中读取具有多个标题的文本文件

Posted

技术标签:

【中文标题】在 Spark 中读取具有多个标题的文本文件【英文标题】:Reading a text file with multiple headers in Spark 【发布时间】:2019-11-27 09:01:07 【问题描述】:

我有一个包含多个标题的文本文件,其中“TEMP”列包含当天的平均温度,然后是记录数。如何正确读取此文本文件以创建 DataFrame

STN--- WBAN   YEARMODA    TEMP     
010010 99999  20060101    33.5 23
010010 99999  20060102    35.3 23
010010 99999  20060103    34.4 24
STN--- WBAN   YEARMODA    TEMP     
010010 99999  20060120    35.2 22
010010 99999  20060121    32.2 21
010010 99999  20060122    33.0 22

【问题讨论】:

你 100% 确定你需要在 Spark DataFrame 中使用它吗? 【参考方案1】:
    您可以在RDD 中将文本文件作为普通文本文件读取 文本文件中有一个分隔符,假设它是space 然后你可以从中删除标题 删除所有不等于标题的行 然后使用.toDF(col_names)RDD 转换为数据帧

像这样:

rdd = sc.textFile("path/to/file.txt").map(lambda x: x.split(" ")) # step 1 & 2
headers = rdd.first() # Step 3
rdd2 = rdd.filter(lambda x: x != headers)
df = rdd2.toDF(headers) # Step 4

【讨论】:

rdd2 = rdd.filter(lambda x: x != headers) 仅当 headers 完全相同时才成立,每次它们在整个文件中重复。但话又说回来,在给定的情况下,这是最好的事情。 @KumarRohit 当然,但是 OP 示例数据具有相同的标题,所以我假设。如果没有,我们仍然可以将filter 条件更改为最适合 OP 要求的任何内容 @pissall 我正在尝试将这些文本文件中的许多读入 rdd ` rdd = sc.textFile(readings_path+"/*").map(lambda x:x.split(" ")) header = rdd.first() records = rdd.filter(lambda x: x!=header) readings = records.toDF(header) readings.show(5) ` 但我在 rdd.first() 处遇到错误。此外,分隔符不仅仅是一个空格【参考方案2】:

你可以试试这个。我在控制台上试过了。

val x = sc.textFile("hdfs path of text file")
val header = x.first()
var y = x.filter(x=>(!x.contains("STN"))) //this will remove all the line 
var df = y.toDF(header)

希望这对你有用。

【讨论】:

以上是关于在 Spark 中读取具有多个标题的文本文件的主要内容,如果未能解决你的问题,请参考以下文章

Spark - 如何从 S3 读取具有文件名的多个 Json 文件

QT中怎样读取中文文本文件!

labview如何读取文本文档中某一行的字符串

是否可以以相同或不同的顺序将具有相同标题或标题子集的多个 csv 文件读取到 spark 数据帧中?

在R中读取具有多个空格作为分隔符的文本文件

文本流、文档流