RDDでcollect()
を呼び出すと、データセット全体がドライバーに返されるため、メモリ不足が発生する可能性があるため、これを回避する必要があります。
データフレームで呼び出された場合、collect()
は同じように動作しますか?select()
メソッドはどうですか?
データフレームで呼び出された場合、collect()
と同じように機能しますか?
- 収集(アクション)-データセットのすべての要素をドライバープログラムで配列として返します。これは通常、フィルターまたはデータの十分に小さいサブセットを返す他の操作の後に役立ちます。
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()
を使用する場合のように)
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)]
ドライバ上のすべての要素を印刷するには、collect()メソッドを使用して、最初にRDDをドライバノードに持ってくることができます:rdd.collect()。foreach(println)。 ただし、collect()はRDD全体を1台のマシンにフェッチするため; RDDのいくつかの要素のみを印刷する必要がある場合、より安全なアプローチはtake()を使用することです:rdd.take(100).foreach(println)。
select
を呼び出すと、結果はlazy
になります評価:例:
val df1 = df.select("col1")
val df2 = df1.filter("col1 == 3")
上記の両方のステートメントは、df
、show
など、そのcollect
でアクションを呼び出すときに実行される遅延パスを作成します。
val df3 = df2.collect()
変換の最後に.explain
を使用して、より詳細な情報がここにある計画に従ってください 変換とアクション
Select
は、dataframe
の一部またはすべてのフィールドを投影するために使用されます。出力としてvalue
ではなく、新しいdataframe
を提供します。そのtransformation
。
Select
は変換であり、アクションではないため、遅延評価されます(実際には、演算をマッピングするだけでは計算されません)。 Collect
はアクションです。
試してください:
df.limit(20).collect()