random split在Dataframe列反转时生成不同的拆分

dwthyt8l  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(491)

我一直在玩databrick笔记本,我遇到了一个奇怪的问题。逻辑是我读了 parsed_points_df 从一个文件中,缓存它,然后从中创建一个Dataframe。但是,根据列顺序,mllib的randomsplit()生成不同的数据集,因此标签列的平均值也不同。既然平均数是交换的和结合的,结果不应该是相同的吗?
我不确定到底是什么问题。我看了不同的博客,尝试了不同的技术,比如缓存、重新分区,但似乎什么都没用。
代码段1和2如下:
代码段1

parsed_data_df = parsed_points_df.select( parsed_points_df['labels'] - min_year, 
  'features').withColumnRenamed('(labels - 1922.0)', 'label')  //COLUMN ORDER 1

  weights = [.8, .1, .1]
  seed = 42
  parsed_train_data_df, parsed_val_data_df, parsed_test_data_df = 
  parsed_data_df.randomSplit(weights, seed=seed)
  average_train_year = (parsed_train_data_df.selectExpr('avg(label) as avg')).first()

代码段2

parsed_data_df = parsed_points_df.select('features', parsed_points_df['labels'] -
  min_year,).withColumnRenamed('(labels - 1922.0)', 'label').  // COLUMN ORDER 2

  weights = [.8, .1, .1]
  seed = 42
  parsed_train_data_df, parsed_val_data_df, parsed_test_data_df = 
  parsed_data_df.randomSplit(weights, seed=seed)
  average_train_year = (parsed_train_data_df.selectExpr('avg(label) as avg')).first()
9cbw7uwe

9cbw7uwe1#

即使你有 seed 但是,由于 df.sample 已实施。你可以阅读下面的博客文章,深入探讨为什么会这样。
一般建议是读取源数据,执行拆分,将每个Dataframe存储为单独的文件,然后在所有实验中始终使用这些保存的Dataframe。

相关问题