このデータフレームを変換するこれらの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
種類を表示できますか?いくつのレコードがありますか? –
6724個のレコードがあり、それぞれラベルとフィーチャーのタプルです。ラベルはフロートであり、フィーチャは浮動小数点のDenseVectorです。私の質問では、コードの2番目のブロックの最初の行の例を見ることができます。 – vaerek
ここで何らかの浮動小数点丸め誤差が発生していると思いますか? – vaerek