2017-03-21 3 views
2

나는 두 개의 서로 다른 dataframe의 filterings에서 찾고, 나는 그들이 무엇의 차이를 볼 수 없습니다 :필터링 스파크 dataframe 옵션

옵션 1 :

df.filter(df.col("myColumn").equalTo("test")) 

옵션 2 :

df.filter(col("myColumn").equalTo("test")) 

Column 개체가 인스턴스화 된 데이터 프레임과 단지 sp30 sql 프레임 워크의 col 함수를 사용하는 것의 차이점은 무엇입니까? 우리는 계획을 비교하면

답변

2

, 그들은 정확히 동일합니다

val df = sc.parallelize(Seq((1,"a",123),(2,"b",456))).toDF("col1","col2","col3") 

scala> df.filter(df.col("col2").equalTo("b")).explain 
== Physical Plan == 
TungstenProject [_1#0 AS col1#3,_2#1 AS col2#4,_3#2 AS col3#5] 
Filter (_2#1 = b) 
    Scan PhysicalRDD[_1#0,_2#1,_3#2] 

scala> df.filter(col("col2").equalTo("b")).explain 
== Physical Plan == 
TungstenProject [_1#0 AS col1#3,_2#1 AS col2#4,_3#2 AS col3#5] 
Filter (_2#1 = b) 
    Scan PhysicalRDD[_1#0,_2#1,_3#2] 

나는 이렇게 대답 할 수있는 몇 가지 더 재미를 위해 같은 설명 계획을 생성하는 방법뿐만 아니라

scala> df.filter(df("col2").equalTo("b")).explain 
== Physical Plan == 
TungstenProject [_1#0 AS col1#3,_2#1 AS col2#4,_3#2 AS col3#5] 
Filter (_2#1 = b) 
    Scan PhysicalRDD[_1#0,_2#1,_3#2] 

scala> df.filter(df("col2") === "b").explain 
== Physical Plan == 
TungstenProject [_1#0 AS col1#3,_2#1 AS col2#4,_3#2 AS col3#5] 
Filter (_2#1 = b) 
    Scan PhysicalRDD[_1#0,_2#1,_3#2] 

을 포함하여 직접 질문 : 아니요, 두 구문을 실행하는 방법에 차이가없는 것 같습니다

+1

기능을 가져 오는 데 필요한 col 함수 (일반적으로 implicits)를 사용하면 하나의 차이점이 있습니다. 이것은 같은 방식으로 작동하는 다른 라이브러리 (AKKA HTTP)를 방해 할 수 있으며, 이들을 함께 연결해야하는 경우 고통이됩니다. 이것은 매우 드물지만. –

0

실행 계획에는 차이가 없습니다 ence.

유일한 차이점은 특정 열에 액세스하는 방법입니다. 은 기본적으로 당신은

df.filter(col("myColumn").equalTo("test")) 

그것은 "COL의 가치를 찾을 수 없습니다"라는 말을 사용하여 dataframe의 열을 액세스 할 수 없습니다. 위의 구문을 사용하려면 다음을 가져와야합니다.

import org.apache.spark.sql.functions._ 
rdd.filter(col("myColumn").equalTo("test")) 

위의 스파크를 가져 오면 필터를 수행하는 동일한 데이터 프레임의 열을 참조하려는 것입니다. 반면

rdd.filter(rdd.col("myColumn").equalTo("test")) 

는 dataframe의 열을 액세스 할 수있는 기본 방법입니다.