2017-08-30 18 views
2

Spark with Javaコネクタを使用してデータを処理しています。Spark Dataframeのcount()APIの代替手段

私がデータで行う必要がある基本的な操作の1つは、データフレーム内のレコード(行)の数を数えることです。

私はdf.count()を試しましたが、実行時間は非常に遅いです(2-3Mレコードの場合は30-40秒)。

また、正確なカウント数が必要なため、システムの要件により、私はdf.rdd().countApprox() APIを使用したくありません。

もっと速い実行時間で、df.count()と全く同じ結果を返す代替案を誰かに教えてもらえますか?

返信いただきありがとうございます。

+1

を使用する方法の参照です。しかし、データフレームに対して複数のアクションを実行する場合は、 'cache()'の使用を検討することができます。https://stackoverflow.com/questions/45749580/same-set-of-tasks-are-repeated-in-multiple-stages -in-a-spark-job/45749730#45749730 – Shaido

+0

実際には、ほとんどの場合、異なるクエリから得た異なるデータセットで実行されるカウントアクションは1つだけです。しかし、ありがとう、Shaido – tuancoltech

+1

私はあなたが(変換ではなく)アクションを実行する前にデータが実際に読み込まれていないと思う。したがって、実行時間は、ディスクまたはデータベースからデータを読み取ることに一部起因する可能性があります。 – Shaido

答えて

3
df.cache 
df.count 

最初のカウントの実行中にキャッシュされるので、最初は遅くなりますが、その後のカウントでは良好なパフォーマンスが得られます。

レバレッジ処理df.cacheは、使用状況によって異なります。

+0

私が理解する限り、上のコメントからShaidoが指摘したように、同じデータセットに対して複数のアクションを呼び出す場合は、あなたのアプローチはより高速になります。ただし、データセットごとに1つのアクションしかありません。その後、新しいデータセットを取得するために新しいクエリを実行し、それに対して別のカウントアクションを呼び出します。だから私の考えでは、このアプローチはあまり役に立たないと思う。 – tuancoltech

1

データフレームに行があるかどうかを確認する簡単な方法は、Try(df.head)を実行することです。成功の場合、データフレームには少なくとも1つの行があります。失敗の場合、データフレームは空です。 Here's a scala implementation of this.

Here is the reason why df.count() is a slow operation.

+0

私はここで私の質問に直接関係ないと思います。しかし、ありがとう、ソフム。 – tuancoltech

1

カウントは非常に高速です。あなたは、あなたが数えているデータフレームを生成するために行う他の操作、データの読み込みと変換を調べる必要があります。それはカウント自体ではなくあなたを減速させる部分です。

カウントに影響しない変換をロードまたは切り捨てるデータの量を減らすことができれば、処理速度を上げることができます。それがオプションではない場合、あなたはできるかもしれません。より効率的に変換を記述します。ボトルネックが何であるかは言えませんが、あなたの変容を知らなくても。

+0

ありがとうございました。上記のように、Sparkのデータフレームにデータをロードして、クエリやカウントを追加する必要はありませんでした。現在、航空宇宙のクライアントを使用して仕事をしています。私はそれがまさに私が探しているものだと思います。 – tuancoltech

0

私は、データをSparkデータフレームにロードして以降のクエリとカウントを行う必要はないことを知りました。

代わりに、私たちは仕事をするためにaerospikeクライアントを使用することができ、上記のアプローチよりもはるかに高速です。

は、ここで私は任意のより良い代替手段があるとは思わないエアロクライアントに http://www.aerospike.com/launchpad/query_multiple_filters.html

おかげでみんな