2017-12-28 8 views
1

나는 두개의 Spark 데이터 프레임을 가지고 있는데, 나중에 합류하고 선택한다. Dataframes 중 하나의 특정 열을 선택하고 싶습니다. 그러나 다른 열에는 동일한 열 이름이 있습니다. 따라서 모호한 열에 대한 예외가 발생합니다.동일한 열이있는 데이터 집합을 결합하고 하나를 선택하는 방법?

d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id", "left").select($"d1.columnName") 

이 :

나는 이것을 시도

d1.join(d2, d1("id") === d2("id"), "left").select($"d1.columnName") 

을했지만 작동하지 않습니다.

+0

당신이 _ 말했을 때 "그러나 그것은 작동하지 않습니다."_ 에러/예외가 무엇입니까? –

답변

0

어떤 스파크 버전을 사용하고 있습니까? 데이터 프레임 샘플을 넣을 수 있습니까? 이 시도 :

스파크 두 DataFrames에서 열을 결합 할 때 당신을 위해 어떤 자동 이름 바꾸기를하지 않기 때문에이 문제가 발생
d2prim = d2.withColumnRenamed("columnName", d2_columnName) 
d1.join(d2prim , Seq("id"), "left_outer").select("columnName") 
+0

해결책이 아닌 해결책이라고 할 수 있습니다. –

1

. 가입하기 전에 하나의 열 이름을 바꿀 필요가 있습니다. 스파크는이를위한 방법을 제공합니다. 조인 후에 이름이 바뀐 컬럼을 h 제할 수 있습니다.

val df2join = df2.withColumnRenamed("id", "join_id") 
val joined = df1.join(df2, $"id" === $"join_id", "left").drop("join_id") 
+0

예, 오타입니다. 나는 잃어버린 동등한 것을 고쳤다. 또한 게시 된 답변과 일치하도록 허용 된 답변이 수정되었습니다. – RyanW

0

나는 두 dataframes 내가 가입하고 나중에 선택하고

val d1 = spark.range(3).withColumn("columnName", lit("d1")) 
scala> d1.printSchema 
root 
|-- id: long (nullable = false) 
|-- columnName: string (nullable = false) 

val d2 = spark.range(3).withColumn("columnName", lit("d2")) 
scala> d2.printSchema 
root 
|-- id: long (nullable = false) 
|-- columnName: string (nullable = false) 

있습니다. 데이터 프레임 중 하나의 특정 열을 선택하고 싶습니다. 그러나 다른 열에는 동일한 열 이름이 있습니다.

val q1 = d1.as("d1") 
    .join(d2.as("d2"), Seq("id"), "left") 
    .select("d1.columnName") 
scala> q1.show 
+----------+ 
|columnName| 
+----------+ 
|  d1| 
|  d1| 
|  d1| 
+----------+ 

당신은 그냥 작동 볼 수 있듯이.


그래서 왜 효과가 없었습니까? 각각을 분석해 보겠습니다.

// you started very well 
d1.as("d1") 
    // but here you used $ to reference a column to join on 
    // with column references by their aliases 
    // that won't work 
    .join(d2.as("d2"), $"d1.id" === $"d2.id", "left") 
    // same here 
    // $ + aliased columns won't work 
    .select($"d1.columnName") 

PROTIP : 사용 d1("columnName")는 dataframe의 특정 열을 참조합니다.

다른 쿼리

잘 될 뻔했으나 ...

d1.join(d2, d1("id") === d2("id"), "left") // <-- so far so good! 
    .select($"d1.columnName") // <-- that's the issue, i.e. $ + aliased column 
관련 문제