2016-04-19 3 views
1

私はPySparkで、このようなデータフレームを持っている(これはテイクの結果である(3)、データフレームは非常に大きいです):和演算は、例外TypeErrorを与える

sc = SparkContext() 
df = [Row(owner=u'u1', a_d=0.1), Row(owner=u'u2', a_d=0.0), Row(owner=u'u1', a_d=0.3)] 

同じ所有者にはさらに多くの行があります。私は何をする必要があることただし、スキーマがdouble型の値ではなく、文字列(これが含まれている、所有者ごとのフィールドa_dの値を合計するグループ化した後、

b = df.groupBy('owner').agg(sum('a_d').alias('a_d_sum')) 

などが、これは誤り

TypeError: unsupported operand type(s) for +: 'int' and 'str'

をスローしていますprintSchema()から来ます):

root 
|-- owner: string (nullable = true) 
|-- a_d: double (nullable = true) 

ここで何が起こっていますか?

+0

ですか?つまり、すべての行に有効なa_d値があることを確認しましたか? – mgaido

+0

@ mark91 a_dフィールドは、別のデータフレーム内の2つの二重列の乗算から来ています。文字列ではありません。これをチェックできる方法はありますか? –

+0

あなたは基礎となるRDDを取得し、フィールドa_d ....でRegExpを使ってそれをフィルタリングするようなことをすることができます。あるいは、Hiveテーブルに結果を書き込んで、そのカラムでHiveを使ってそれを読み取ることができます。あなたはこの問題を示す少数のデータのサブセットを持っています。あなたはそれを調べることすらできます... – mgaido

答えて

6

正しい合計機能を使用していませんが、built-inの機能はsum(デフォルト)です。

のでbuild-in機能が動作しません理由は、それが渡された列の名前が文字列とbuilt-in関数は、文字列に適用することができないとして、ここで引数として反復可能を取るだ です。 Ref. Python Official Documentation

あなたはpyspark.sql.functionsから適切な機能をインポートする必要があります:あなたは、すべての行が罰金であることを確認してください

from pyspark.sql import Row 
from pyspark.sql.functions import sum 

df = sqlContext.createDataFrame([Row(owner=u'u1', a_d=0.1), Row(owner=u'u2', a_d=0.0), Row(owner=u'u1', a_d=0.3)]) 

df2 = df.groupBy('owner').agg(sum('a_d').alias('a_d_sum')) 
df2.show() 

# +-----+-------+ 
# |owner|a_d_sum| 
# +-----+-------+ 
# | u1| 0.4| 
# | u2| 0.0| 
# +-----+-------+ 
+0

どのバージョンのsparkを使用していますか?なぜなら、それが組み込み関数の合計でない限り、エラーを再現できないからです。あなたはpysparkでそれを実行しているか、あなたのスクリプトを提出していますか? – eliasah

+0

あなたはあなたのpysparkに 'sum'を書いて、ここで出力して更新できますか? – eliasah

+0

申し訳ありませんが、私のせいで、私は輸入していたと確信していました。なぜ組み込みが失敗するのか、strがどこにあるのですか? –