web-dev-qa-db-ja.com

Sparkを強制してDataFrame操作をインラインで評価する方法

Spark RDD docs によると:

Sparkのすべての変換は、結果をすぐに計算しないという点で怠惰です...この設計により、Sparkをより効率的に実行できます。

データフレームに対して特定の操作を実行する必要がある場合がありますそのときと今。しかし、データフレーム操作は「遅延評価」(上記のとおり)であるため、これらの操作をコードに記述した場合、Spark will 実際にこれらの操作を残りのコードとインラインで実行します。例えば:

_val someDataFrame : DataFrame = getSomehow()
val someOtherDataFrame : DataFrame = getSomehowAlso()
// Do some stuff with 'someDataFrame' and 'someOtherDataFrame'

// Now we need to do a union RIGHT HERE AND NOW, because
// the next few lines of code require the union to have
// already taken place!
val unionDataFrame : DataFrame = someDataFrame.unionAll(someOtherDataFrame)

// Now do some stuff with 'unionDataFrame'...
_

したがって、これに対する私の回避策は(これまでのところ)、時間に敏感なデータフレーム操作の直後に .show() または .count() を実行することでした。 、 そのようです:

_val someDataFrame : DataFrame = getSomehow()
val someOtherDataFrame : DataFrame = getSomehowAlso()
// Do some stuff with 'someDataFrame' and 'someOtherDataFrame'

val unionDataFrame : DataFrame = someDataFrame.unionAll(someOtherDataFrame)
unionDataFrame.count()  // Forces the union to execute/compute

// Now do some stuff with 'unionDataFrame'...
_

... whichforcesSparkは、データフレーム操作をその場でインラインで実行します。

これは私にはひどくハッキー/不器用だと感じます。だから私は尋ねます:オンデマンドで発生する(そして遅延評価されない)forceデータフレーム操作を行うためのより一般的に受け入れられているおよび/または効率的な方法はありますか?

8
smeeb

いいえ

actionを呼び出して、Sparkを強制して実際の作業を行う必要があります。Transformationswill ' tはその効果を引き起こします、そしてそれは愛する理由の1つです 火花


ちなみに、 spark は、何かを「今ここで」実行する必要があることをよく知っているので、おそらくあなたは焦点を合わせています間違った点。


count()show()が「アクション」と見なされることを確認できますか

Spark in documentation 、ここでcount()がリストされています。show()はリストされていません。 、以前は使用したことがありませんが、アクションのように感じます-実際の作業を行わずに結果を表示するにはどうすればよいですか?:)

Sparkが自動的にそれを取得し、(ジャストインタイムで)結合を行うことをほのめかしていますか?

はい! :)

spark 呼び出した変換を記憶し、actionが表示されると、それらを実行します。ちょうどいいタイミングで!


覚えておくべきこと:このポリシーにより、actionが表示された場合にのみ実際の作業を行うため、変換で発生した論理エラーは表示されません。 (s)、アクションが発生するまで!

7
gsamaras

ある時点で、必要なときにアクションを実行したいということに同意します。たとえば、Sparkストリーミングでデータをストリーミングしていて、すべてのRDDの変換を累積するのではなく、すべてのRDDで実行された変換を評価したい場合、突然これに対してアクションを実行します大量のデータセット。

ここで、DataFrameがあり、その上ですべての変換を行った場合、sparkContext.sql("CACHE table <table-name>")を使用できます。

このキャッシュは熱心なキャッシュです。これにより、このDataFrameでアクションがトリガーされ、このDataFrameですべての変換が評価されます。

2