是否始终在同一逻辑计划中给出相同的ID?

时间:2017-12-16 13:26:57

标签: apache-spark pyspark

在你的下方,你会看到我试图做的简化版本。我从存储在S3中的150 Dataframe(> 10TB)加载parquets,然后我为此数据框提供了一个带有func.monotonically_increasing_id()的id列。之后我保存了这个dataframe的几个偏差。我申请的功能比我在这里提出的要复杂一点,但我希望这能得到重点

DF_loaded = spark.read.parquet(/some/path/*/')
DF_with_IDs = DF_loaded.withColumn('id',func.monotonically_increasing_id())
#creating parquet_1    
DF_with_IDs.where(col('a').isNotNull()).write.parquet('/path/parquet_1/')
#creating parquet_2
DF_with_IDs.where(col('b').isNotNull()).write.parquet('/path/parquet_2/')

现在我注意到创建parquet_1后的火花再次加载来自S3的所有数据以创建parquet_2。现在我担心parquet_1的ID与parquet_2的ID不匹配。同一行在parquets中都有不同的ID。因为据我所知,逻辑计划的火花出现如下:

#parquet_1
load_data -> give_ids -> make_selection -> write_parquet
#parquet_2
load_data -> give_ids -> make_selection -> write_parquet

两个parquets中的相同行的ID是否相同?

1 个答案:

答案 0 :(得分:1)

只要:

  • 您使用最新版本的Spark(SPARK-13473SPARK-14241)。
  • 操作之间没有配置更改(配置中的更改可能会影响分区数量,因此会影响ID)。

monotonically_increasing_id应该稳定。请注意,这会禁用谓词下推。

rdd.zipWithindex.toDF应该是稳定的,与配置无关,因此可能更为可取。