Spark 去掉前幾行 & 去掉表頭

前言

在運行例子的時候. 遇到需要去除表頭的情況. 將一般的幾種做法記錄於此.

  • 文件
班級ID 姓名 年齡 性別 科目 成績
12 張三 25 男 chinese 50
12 張三 25 男 math 60
12 張三 25 男 english 70
12 李四 20 男 chinese 50
12 李四 20 男 math 50
12 李四 20 男 english 50
12 王芳 19 女 chinese 70
12 王芳 19 女 math 70
12 王芳 19 女 english 70
13 張大三 25 男 chinese 60
13 張大三 25 男 math 60
13 張大三 25 男 english 70
13 李大四 20 男 chinese 50
13 李大四 20 男 math 60
13 李大四 20 男 english 50
13 王小芳 19 女 chinese 70
13 王小芳 19 女 math 80
13 王小芳 19 女 english 70

相關操作-個人選擇

  • 去除第一行
# 使用textFile讀取整個文件.
JavaRDD<String> examLinesRDD = SeanSparkConfig.sparkContext.textFile(SeanSparkConfig.exameDateFilePath);

# 讀取文件第一行
String firstLine = examLinesRDD.first();
JavaRDD<Student> studentRDD;studentRDD = examLinesRDD.
				filter(line -> !line.equals(firstLine)). // 去除第一行表頭

其實使用filter()算子過濾我們需要拋棄的行是最容易的操作.


其餘相關操作(參考1)

參考1

delcomments = ["嗯嗯嗯嗯", "啦啦啦", "買買買買"]
def delcom(line):
    for i in delcomments:
        if i in line:
            return 1
    return 0
 
comment = comment.filter(lambda line: delcom(line) != 1)

如何刪掉rdd中的某幾行數據?


參考2

# 使用zipWithIndex算子
rdd.zipWithIndex().filter(_._2>=n).keys  // n換成對應的第幾列即可

Spark RDD去掉前n行數據


參考3-比較詳細

  • 方法1-zipWithIndex 索引法.
val path = "files/data.txt"
val rdd = sc.textFile(path)
println("分區數:" + rdd.getNumPartitions)
val rdd1 = rdd.zipWithIndex()
//過濾掉索引小於等於2的
val rdd2 = rdd1.filter(_._2 > 2)
rdd1.foreach(println)
println("**********分割線***********")
rdd2.map(kv => kv._1).foreach(println)

根據統計. 其與分片無關. 但是當數據量過多時, 加索引產生性能問題.

  • 方法2-take/fileter 法
val path = "files/data.txt"
val rdd = sc.textFile(path, 8)
println("分區數:" + rdd.getNumPartitions)
//前三條
val arr = rdd.take(3)
//過濾掉arr裏的數據
val rdd3 = rdd.filter(!arr.contains(_))
rdd3.foreach(println)
  • 方法3-Linux相關命令
# 查詢原文件
cat data.txt 
# 新建覆蓋文件 
tail -n+4 data.txt > data_new.txt
# 替換
mv data_new.txt data.txt 

文件過大可能會有問題?

如何解決spark開發中遇到需要去掉文件前幾行數據的問題


總結

其實思路非常簡單. 查詢出你需要過濾的數據, 使用filter算子進行過濾即可.
對於不同分片上的數據. 你可以考慮寫死代碼的方式.
String toFilter="姓名 年齡 ID 性別"; rdd.filter(str->!str.equals(toFilter)).
還有一點值得注意的是, 使用equals替換==. 因爲多個Executor的情況下, 是在不同JVM中的.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章