randomSplit メソッドの動作Behavior of the randomSplit Method

データフレームで randomSplit を使用すると、一貫性のない動作が発生する可能性があります。When using randomSplit on a DataFrame, you could potentially observe inconsistent behavior. 次に例を示します。Here is an example:

df = spark.read.format('inconsistent_data_source').load()
a,b = df.randomSplit([0.5, 0.5])
a.join(broadcast(b), on='id', how='inner').count()

通常、このクエリは 0 を返します。Typically this query returns 0. ただし、基になるデータソースまたは入力データフレームによっては、クエリによって0個を超えるレコードが生成される場合があります。However, depending on the underlying data source or input DataFrame, in some cases the query could result in more than 0 records.

この予期しない動作は、RDD パーティション間のデータ分散がべき等ではなく、クエリの実行中に再配置または更新され、randomSplit メソッドの出力に影響を与える可能性があるという事実によって説明されています。This unexpected behavior is explained by the fact that data distribution across RDD partitions is not idempotent, and could be rearranged or updated during the query execution, thus affecting the output of the randomSplit method.

注意

  • Spark DataFrames RDDs はパーティション分割の順序を保持します。この問題が発生するのは、クエリの出力がパーティション間の実際のデータ分布に依存している場合のみです。たとえば、_ファイル1、2、3の値が常にパーティション1に表示され_ます。Spark DataFrames and RDDs preserve partitioning order; this problem only exists when query output depends on the actual data distribution across partitions, for example, values from files 1, 2 and 3 always appear in partition 1.
  • また、デルタキャッシュを使用しているときにも問題が発生する可能性があります。The issue could also be observed when using Delta cache. この場合も、以下に示すすべてのソリューションが適用されます。All solutions listed below are still applicable in this case.

ソリューションSolution

次のいずれかを実行します。Do one of the following:

  • 明示的な Apache Spark RDD キャッシュを使用するUse explicit Apache Spark RDD caching

    df = inputDF.cache()
    a,b = df.randomSplit([0.5, 0.5])
    
  • 列または列のセットによってパーティションを再分割するRepartition by a column or a set of columns

    df = inputDF.repartition(100, 'col1')
    a,b = df.randomSplit([0.5, 0.5])
    
  • 集計関数の適用Apply an aggregate function

    df = inputDF.groupBy('col1').count()
    a,b = df.randomSplit([0.5, 0.5])
    

これらの操作は、データの永続化またはシャッフルによって、Spark ジョブ内の複数のパーティションにわたって一貫したデータ分散が行われます。These operations persist or shuffle data resulting in the consistent data distribution across partitions in Spark jobs.