>>> 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
が2つあり、1つを削除したいです。どのようにできるのか?
Sparkドキュメントを読むと、簡単な解決策が見つかりました。
sparkのバージョン1.4以降、データフレームのpysparkで使用できる関数drop(col)
があります。
2つの方法で使用できます
df.drop('age').collect()
df.drop(df.age).collect()
@Patrickの答えに加えて、次を使用して複数の列をドロップできます。
columns_to_drop = ['id', 'id_copy']
df = df.drop(*columns_to_drop)
これを行う簡単な方法は、ユーザー「select
」を使用して、df.columns
でcolumns
、dataframe
のすべてのdf
のリストを取得できることを認識することです。
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)
次の2つの方法を使用できます。
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: _*)
次のように列を削除できます。
df.drop("column Name).columns
あなたの場合:
df.drop("id").columns
複数の列を削除する場合は、次の操作を実行できます。
dfWithLongColName.drop("Origin_COUNTRY_NAME", "DEST_COUNTRY_NAME")
2つのdataFramesを検討します。
>>> aDF.show()
+---+----+
| id|datA|
+---+----+
| 1| a1|
| 2| a2|
| 3| a3|
+---+----+
そして
>>> bDF.show()
+---+----+
| id|datB|
+---+----+
| 2| b2|
| 3| b3|
| 4| b4|
+---+----+
探しているものを達成するには、2つの方法があります。
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|
+----+----+----+