2017-11-07 9 views
1

Spark Dataframeのビットを持つ列を持っていますdf。列は、形式の文字列です:Spark Dataframe APIを使用して列内の特定の文字をカウントする

10001010000000100000000000000000 
10001010000000100000000100000000 

は、新しい列"no_of_ones"を作成し、データフレームを使用してのものの頻度をカウントするための簡単かつ効果的な方法はありますか? RDDを使用して私はmap(lambda x:x.count('1'))(pyspark)することができます。 さらに、どのようにリストの位置を取得することができますか?

+0

質問が投票された理由は分かりませんが、回答は投票されました。 –

答えて

6

私が考えることの1つの方法は、ゼロをすべて削除してフィールドの長さを数えることです。一般的に

df.show 
+--------------------+ 
|   bytestring| 
+--------------------+ 
|10001010000000100...| 
|10001010000000100...| 
+--------------------+ 


df.withColumn("no_of_ones" , length(regexp_replace($"bytestring", "0", ""))).show 
+--------------------+----------+ 
|   bytestring|no_of_ones| 
+--------------------+----------+ 
|10001010000000100...|   4| 
|10001010000000100...|   5| 
+--------------------+----------+ 
+0

回答が投票され、質問が投票されたのはなぜですか? :-) –

1

あなたは(PY)スパークSQLの事前定義された機能に必要なものを見つけることができないとき、あなたは(UDFを参照してください)好きなんユーザー定義関数(UDF)を書くことができます。

新しい文字列をインスタンス化して正規表現をコンパイルする必要がないので、うまくコード化されたudfがscalaやjavaの正規表現より速いことに注意してください。しかし、Pythonコードをエグゼキュータ上で実行すると常にパフォーマンスが著しく損なわれるため、pysparkの方がはるかに遅くなります。

関連する問題