2016-11-11 4 views
1

このデータフレームを変換するこれらの2つの方法が異なる出力データフレームをもたらすのはなぜですか? rddのデータフレームとマップでselectを使用すると同じ値が出力されるようですが、カラムの平均をとると結果が異なります。何が起きてる?pysparkの選択とマップは出力値の点でどのように違いますか?

wrong_parsed_data_df = parsed_points_df.select((parsed_points_df.label - min_year).alias('label'), 'features') 
parsed_data_df = parsed_points_df.rdd.map(lambda row: LabeledPoint(row['label'] - min_year, row['features'])).toDF() 

# View the first point 
print '\n{0}'.format(wrong_parsed_data_df.first()) 
print '\n{0}'.format(parsed_data_df.first()) 

print '\n{0}'.format(wrong_parsed_data_df.count()) 
print '\n{0}'.format(parsed_data_df.count()) 

print wrong_parsed_data_df.printSchema() 
print parsed_points_df.printSchema() 

Ouputs:

Row(label=79.0, features=DenseVector([0.8841, 0.6105, 0.6005, 0.4747, 0.2472, 0.3573, 0.3441, 0.3396, 0.6009, 0.4257, 0.6049, 0.4192])) 

Row(features=DenseVector([0.8841, 0.6105, 0.6005, 0.4747, 0.2472, 0.3573, 0.3441, 0.3396, 0.6009, 0.4257, 0.6049, 0.4192]), label=79.0) 

6724 

6724 

root 
|-- label: double (nullable = true) 
|-- features: vector (nullable = true) 

None 
root 
|-- features: vector (nullable = true) 
|-- label: double (nullable = true) 

その後:

average_train_year = (parsed_train_data_df 
        .selectExpr('avg(label)').first())[0] 

wrong_average_train_year = (wrong_parsed_train_data_df 
         .selectExpr('avg(label)').first())[0] 

print average_train_year 
print wrong_average_train_year 

出力:

54.0403195838 
54.0570419918 
+0

種類を表示できますか?いくつのレコードがありますか? –

+0

6724個のレコードがあり、それぞれラベルとフィーチャーのタプルです。ラベルはフロートであり、フィーチャは浮動小数点のDenseVectorです。私の質問では、コードの2番目のブロックの最初の行の例を見ることができます。 – vaerek

+0

ここで何らかの浮動小数点丸め誤差が発生していると思いますか? – vaerek

答えて

0

最も可能性の高いソリューションは、あなたのコード内のエラーです - あなたは中parsed_data_dfを使用しています最初のセルとつ目はです。

+0

おっと、そのエラーを指摘してくれてありがとう。残念ながら、私は自分のコードをスタックオーバーフローに転記させて、私のソースコードには存在しないというエラーだったので、ここで何か他のものが使われています。私は私の質問のテキストを修正しました。 – vaerek

+0

ちょうどあなたの詳細については、これは、それらの派生データフレームが作成された方法である: 'parsed_train_data_df、parsed_val_data_df、parsed_test_data_df = parsed_data_df.randomSplit(重み、種子) wrong_parsed_train_data_df、wrong_parsed_val_data_df、wrong_parsed_test_data_df = wrong_parsed_data_df.randomSplit(重み、種子)' – vaerek

関連する問題