2017-08-28 6 views
1

私は、選択や削除がどのように機能しているのかを疑いはしないと思います。
データセットが爆発的になり、新しく生成されたエントリに列の一部をコピーしたくありません。選択/ドロップは実際に列を削除しませんか?

val ds = spark.sparkContext.parallelize(Seq(
     ("2017-01-01 06:15:00", "ASC_a", "1"), 
     ("2017-01-01 06:19:00", "start", "2"), 
     ("2017-01-01 06:22:00", "ASC_b", "2"), 
     ("2017-01-01 06:30:00", "end", "2"), 
     ("2017-01-01 10:45:00", "ASC_a", "3"), 
     ("2017-01-01 10:50:00", "start", "3"), 
     ("2017-01-01 11:22:00", "ASC_c", "4"), 
     ("2017-01-01 11:31:00", "end", "5") 
    )).toDF("timestamp", "status", "msg") 
    ds.show() 

    val foo = ds.select($"timestamp", $"msg") 
    val bar = ds.drop($"status") 
    foo.printSchema() 
    bar.printSchema() 
    println("foo " + foo.where($"status" === "end").count) 
    println("bar" + bar.where($"status" === "end").count) 

出力:

root 
|-- timestamp: string (nullable = true) 
|-- msg: string (nullable = true) 

root 
|-- timestamp: string (nullable = true) 
|-- msg: string (nullable = true) 

fooの2
バー2

なぜ私はまだ私は
a)は選択しなかったの両方かかわらのため2の出力を得るのですかステータス
b)ステータスが低下した

EDIT:
println("foo " + foo.where(foo.col("status") === "end").count)には、列のステータスはありません。これはprintln("foo " + foo.where($"status" === "end").count)と同じではないでしょうか?

答えて

2

オプティマイザが実行計画を再編成して自由であるので、なぜ私はまだ両方

のための2の出力を得るのですか。実際には、あなたがそれをチェックした場合:

== Physical Plan == 
*Project [_1#4 AS timestamp#8, _3#6 AS msg#10] 
+- *Filter (isnotnull(_2#5) && (_2#5 = end)) 
    +- *SerializeFromObject [staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple3, true])._1, true) AS _1#4, staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple3, true])._2, true) AS _2#5, staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple3, true])._3, true) AS _3#6] 
     +- Scan ExternalRDDScan[obj#3] 

あなたはそのフィルタは可能な限り早期に押し下げられ、プロジェクトの前に実行されて表示されます。だから、と同等です:

SELECT _1 AS timetsatmp, _2 AS msg 
FROM ds WHERE _2 IS NOT NULL AND _2 = 'end' 

おそらくそれはマイナーなバグで、コードが

SELECT * FROM (
    SELECT _1 AS timetsatmp, _2 AS msg FROM ds 
) WHERE _2 IS NOT NULL AND _2 = 'end' 

として翻訳され、例外をスローする必要があります。

関連する問題