2016-07-28 2 views
0

PySpark에서는 기존 팬더 또는 R 스타일 표기법을 사용하여 DataFrame의 이전 열을 기반으로 새 열을 만들 수 없습니다. PySpark하지 않는 이유가 거기에PySpark DataFrames에서 __setitem__이 (가) 완전히 구현되지 않은 이유는 무엇입니까?

TypeError: 'DataFrame' object does not support item assignment 

대신,이 작업을 수행 할 수있는 구현 방법은

df = df.withColumn('newcol', F.concat(df['col_1'], df['col_2'])) 

입니다 :

import pyspark.sql.functions as F 
df['newcol'] = F.concat(df['col_1'], df['col_2']) 

결과는 예를 들어, 나는 두 개의 열을 연결하려고 말 전통적인 DataFrame 표기법을 구현합니까?

답변

1

이 방법과 여러 반례 (SparkR API)를 구현하는 데는 여러 가지 이유가 있지만 근본적인 이유는 구현 순도라고 주장 할 것입니다.

R 또는 Pandas 데이터 프레임과 달리 Spark DataFrame은 변경 불가능한 데이터 구조입니다. 모든 스키마 변경은 전혀 새로운 DataFrame을 생성하므로 다른 방법으로 제안 할만한 모든 조작은 오도 된 것일 수 있습니다.

은 이론적으로 하나의 JVM DataFrame에 대한 참조를 대체하여 __setitem__을 구현 멀리 얻을 수 있지만, 당신이 DataFrame의 신원이 거의 확실한 _jdf에 의한 것을 고려한다면이 매우 unpythonic 것이다.

+0

나는 알고 있다고 생각합니다. 즉, 기존의 데이터 프레임은 변경 가능한 객체 (벡터 목록) 인 반면 Spark DataFrames는 불변입니다. Spark은 함수 프로그래밍 모델에서 설계 되었기 때문입니다. '__setitem__'은 변이 (mutation)이며 불변 개체에는 적용 할 수 없습니다. – Paul

+0

예, 정확히 ... 당신은 그것을 원숭이 패치로 직접 구현할 수 있습니다. 그러나 그것은 비린내가납니다. – zero323

관련 문제