[apache-spark] pyspark 데이터 프레임에서 열을 삭제하는 방법

>>> a
DataFrame[id: bigint, julian_date: string, user_id: bigint]
>>> b
DataFrame[id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]
>>> a.join(b, a.id==b.id, 'outer')
DataFrame[id: bigint, julian_date: string, user_id: bigint, id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]

두 개가 있는데 id: bigint하나를 삭제하고 싶습니다. 어떻게 할 수 있습니까?



답변

Spark 문서를 읽고 더 쉬운 해결책을 찾았습니다.

Spark 버전 1.4부터 drop(col)데이터 프레임의 pyspark에서 사용할 수 있는 기능 이 있습니다.

두 가지 방법으로 사용할 수 있습니다.

  1. df.drop('age').collect()
  2. df.drop(df.age).collect()

Pyspark 문서-Drop


답변

@Patrick의 답변에 추가하면 다음을 사용하여 여러 열을 삭제할 수 있습니다.

columns_to_drop = ['id', 'id_copy']
df = df.drop(*columns_to_drop)


답변

이 작업을 수행하는 쉬운 방법은 “사용자에게있다 select“당신은 모든 목록을 얻을 수 있습니다 실현 columns를 들어 dataframe, dfdf.columns

drop_list = ['a column', 'another column', ...]

df.select([column for column in df.columns if column not in drop_list])


답변

다음과 같이 유지하려는 열의 이름을 명시 적으로 지정할 수 있습니다.

keep = [a.id, a.julian_date, a.user_id, b.quan_created_money, b.quan_created_cnt]

또는보다 일반적인 접근 방식에서는 목록 이해를 통해 특정 열을 제외한 모든 열을 포함합니다. 예를 들어 다음과 같습니다 (의 id열 제외 b).

keep = [a[c] for c in a.columns] + [b[c] for c in b.columns if c != 'id']

마지막으로 조인 결과를 선택합니다.

d = a.join(b, a.id==b.id, 'outer').select(*keep)


답변

두 가지 방법으로 사용할 수 있습니다.

1 : 필요한 열만 유지합니다.

drop_column_list = ["drop_column"]
df = df.select([column for column in df.columns if column not in drop_column_list])

2 : 이것이 더 우아한 방법입니다.

df = df.drop("col_name")

collect () 버전을 피해야합니다. 마스터에게 완전한 데이터 세트를 보낼 것이기 때문에 엄청난 컴퓨팅 노력이 필요합니다!


답변

주제에서 약간 벗어난 것일 수도 있지만 여기에 Scala를 사용하는 솔루션이 있습니다. 확인 Array귀하의에서 열 이름을 oldDataFrame당신이 드롭하려는 열을 삭제합니다 ("colExclude"). 그런 다음 통과 Array[Column]select하고 압축을 풉니 다.

val columnsToKeep: Array[Column] = oldDataFrame.columns.diff(Array("colExclude"))
                                               .map(x => oldDataFrame.col(x))
val newDataFrame: DataFrame = oldDataFrame.select(columnsToKeep: _*)


답변

2 개의 dataFrame을 고려하십시오.

>>> aDF.show()
+---+----+
| id|datA|
+---+----+
|  1|  a1|
|  2|  a2|
|  3|  a3|
+---+----+

>>> bDF.show()
+---+----+
| id|datB|
+---+----+
|  2|  b2|
|  3|  b3|
|  4|  b4|
+---+----+

원하는 것을 달성하기위한 두 가지 방법이 있습니다.

1. 결합 조건이 다릅니다. aDF.id == bDF.id 대신

aDF.join(bDF, aDF.id == bDF.id, "outer")

이것을 쓰십시오 :

aDF.join(bDF, "id", "outer").show()
+---+----+----+
| id|datA|datB|
+---+----+----+
|  1|  a1|null|
|  3|  a3|  b3|
|  2|  a2|  b2|
|  4|null|  b4|
+---+----+----+

이렇게하면 추가 드롭 프로세스가 자동으로 제거됩니다.

2. 별칭 사용 : B 특정 ID와 관련된 데이터를 잃게됩니다.

>>> from pyspark.sql.functions import col
>>> aDF.alias("a").join(bDF.alias("b"), aDF.id == bDF.id, "outer").drop(col("b.id")).show()

+----+----+----+
|  id|datA|datB|
+----+----+----+
|   1|  a1|null|
|   3|  a3|  b3|
|   2|  a2|  b2|
|null|null|  b4|
+----+----+----+