在 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 文件