【问题标题】:Reading a text file with multiple headers in Spark在 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 中使用它吗?

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:
  1. 您可以在RDD 中将文本文件作为普通文本文件读取
  2. 文本文件中有一个分隔符,假设它是space
  3. 然后你可以从中删除标题
  4. 删除所有不等于标题的行
  5. 然后使用.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)

希望这对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多