Spark coreレコード-persist元データ操作

16142 ワード

Spark coreレコード-persist元データ操作
  • 1、同一のrdd上で異なる変換の操作を行う場合、このrdd上の値は変更されず、他のrdd上で元のデータを使用する結果
  • にも影響しない.
  • 試験結果:
  • 2,`ただしpersistまたはcachesがある場合、このrddの下流では同じ元のデータが動作し、後の動作は前の影響
  • を受ける.
  • 試験結果:
  • 1、同一のrdd上で、異なる変換の操作を行う場合、このrdd上の値は変更されず、他のrdd上で元のデータを使用した結果にも影響しない
    case class Name(var name: String, var age: Int, sex: Int)
    object DateTest {
    
        def main(args: Array[String]): Unit = {
            val conf = new SparkConf().setAppName("test").setMaster("local[*]")
            val sc = new SparkContext(conf)
            Logger.getLogger("org").setLevel(Level.WARN)
    
            val data = List(Name("aaa", 1, 1), Name("bbb", 2, 0), Name("ccc", 3, 1))
            val r1 = sc.parallelize(data)
            r1.filter( r => {
                if (r.sex == 1) {
                    r.name = ""
                }
                true
            }).foreach(println)
    
            println("--------------- ")
    
            r1.filter( r => {
                if (r.name.nonEmpty) {
                    r.age = 999
                    true
                } else false
            }).foreach(println)
        }
    
    }
    

    テスト結果:
    Name(bbb,2,0)
    Name(,1,1)
    Name(,3,1)
    --------------- 
    Name(ccc,999,1)
    Name(bbb,999,0)
    Name(aaa,999,1)
    

    2、 persistまたはcachesがある場合、このrddの下流では同じ元のデータが動作し、後の動作は前の影響を受ける
    case class Name(var name: String, var age: Int, sex: Int)
    object DateTest {
    
        def main(args: Array[String]): Unit = {
            val conf = new SparkConf().setAppName("test").setMaster("local[*]")
            val sc = new SparkContext(conf)
            Logger.getLogger("org").setLevel(Level.WARN)
    
            val data = List(Name("aaa", 1, 1), Name("bbb", 2, 0), Name("ccc", 3, 1))
            val r1 = sc.parallelize(data)
            r1.persist()
            r1.filter( r => {
                if (r.sex == 1) {
                    r.name = ""
                }
                true
            }).foreach(println)
    
            println("--------------- ")
    
            r1.filter( r => {
                if (r.name.nonEmpty) {
                    r.age = 999
                    true
                } else false
            }).foreach(println)
        }
    
    }
    

    テスト結果:
    Name(,1,1)
    Name(bbb,2,0)
    Name(,3,1)
    --------------- 
    Name(bbb,999,0)