web-dev-qa-db-ja.com

Sparkデータフレーム:collect()vs select()

RDDでcollect()を呼び出すと、データセット全体がドライバーに返されるため、メモリ不足が発生する可能性があるため、これを回避する必要があります。

データフレームで呼び出された場合、collect()は同じように動作しますか?
select()メソッドはどうですか?
データフレームで呼び出された場合、collect()と同じように機能しますか?

21
Mrinal

アクションと変換

  • 収集(アクション)-データセットのすべての要素をドライバープログラムで配列として返します。これは通常、フィルターまたはデータの十分に小さいサブセットを返す他の操作の後に役立ちます。

spark-sql doc

select(* cols)(変換)-一連の式を射影し、新しいDataFrameを返します。

パラメーター:cols –列名(文字列)または式(列)のリスト。列名の1つが「*」の場合、その列は現在のDataFrameのすべての列を含むように展開されます。**

df.select('*').collect()
[Row(age=2, name=u'Alice'), Row(age=5, name=u'Bob')]
df.select('name', 'age').collect()
[Row(name=u'Alice', age=2), Row(name=u'Bob', age=5)]
df.select(df.name, (df.age + 10).alias('age')).collect()
[Row(name=u'Alice', age=12), Row(name=u'Bob', age=15)]

データフレームでselect(column-name1,column-name2,etc)メソッドを実行すると、select()関数で選択された列のみを保持する新しいデータフレームが返されます。

例えばdfには「name」と「value」などのいくつかの列があると仮定します。

df2 = df.select("name","value")

df2は、dfの列全体のうち、2つの列(「名前」と「値」)のみを保持します。

selectの結果としてのdf2は、ドライバーではなくエグゼキューター内にあります(collect()を使用する場合のように)

sql-programming-guide

df.printSchema()
# root
# |-- age: long (nullable = true)
# |-- name: string (nullable = true)

# Select only the "name" column
df.select("name").show()
# +-------+
# |   name|
# +-------+
# |Michael|
# |   Andy|
# | Justin|
# +-------+

データフレームでcollect()を実行できます( spark docs

>>> l = [('Alice', 1)]
>>> spark.createDataFrame(l).collect()
[Row(_1=u'Alice', _2=1)]
>>> spark.createDataFrame(l, ['name', 'age']).collect()
[Row(name=u'Alice', age=1)]

spark docs

ドライバ上のすべての要素を印刷するには、collect()メソッドを使用して、最初にRDDをドライバノードに持ってくることができます:rdd.collect()。foreach(println)。 ただし、collect()はRDD全体を1台のマシンにフェッチするため; RDDのいくつかの要素のみを印刷する必要がある場合、より安全なアプローチはtake()を使用することです:rdd.take(100).foreach(println)。

31
Yaron

selectを呼び出すと、結果はlazyになります評価:例:

val df1 = df.select("col1")
val df2 = df1.filter("col1 == 3")

上記の両方のステートメントは、dfshowなど、そのcollectでアクションを呼び出すときに実行される遅延パスを作成します。

val df3 = df2.collect()

変換の最後に.explainを使用して、より詳細な情報がここにある計画に従ってください 変換とアクション

6
Karol Sudol

Selectは、dataframeの一部またはすべてのフィールドを投影するために使用されます。出力としてvalueではなく、新しいdataframeを提供します。そのtransformation

2
Rajat Mishra

Selectは変換であり、アクションではないため、遅延評価されます(実際には、演算をマッピングするだけでは計算されません)。 Collectはアクションです。

試してください:

df.limit(20).collect()

2
Jason