pyspark の pandas には、3 種類のデフォルト インデックスがあります。私は彼らの言った行動を再現することができません:
テストするための設定:
import pyspark.pandas as ps
import pandas as pd
import numpy as np
import pyspark
from pyspark.sql import SparkSession
pd.DataFrame({'id':np.arange(20000000),'b':np.random.choice(['a','b','c','d'],size=(20000000,),p=[0.25,0.25,0.25,0.25])}).to_csv('df_s.csv',index=None) #so many rows because the dataset needs to be greater than 128 Mbs otherwise it gets collected in just 1 partition
- シーケンスタイプ
- データは同じノードで収集されます (データフレームには 1 つのパーティションのみが必要ですか?)
- デフォルトのインデックスは [0,1,2,3,...] (単調に 1 ずつ増加)
テスト:
ps.set_option('compute.default_index_type','sequence')
dfsp = ps.read_csv('df_s.csv')
dfsp.head()
output:
id b
0 0 a
1 1 c
2 2 c
3 3 b
4 4 d
#Expected
dfsp.to_spark().rdd.getNumPartitions()
output:
8
#Unexpected
質問: デフォルトのインデックスが「sequence」に設定されている場合、すべてのデータを 1 つのノードで収集する必要があるため、パーティションの数が 1 でないのはなぜですか。
- 分布系列
- 分散方式でインデックスを計算および生成しますが、グローバル シーケンスを内部で生成するには、別の追加の Spark ジョブが必要です。また、結果の自然な順序を保証するものではありません。一般に、それは継続的に増加する数になります。
テスト:
ps.set_option('compute.default_index_type','distributed-sequence')
dfsp = ps.read_csv('df_s.csv')
dfsp.head()
output:
id b
0 0 a
1 1 c
2 2 c
3 3 b
4 4 d
#Expected
dfsp.to_spark().rdd.getNumPartitions()
output:
8
#Unexpected
質問: データフレームが 8 つのコアすべてに分散されるのは予期された動作ですが、インデックスは順序付けされるべきではありません。この動作もsequence
type default index only のようです。
- 分散
- 「分散型」インデックスはパフォーマンスの低下がほとんどなく、常に単調に増加する数値を作成します。各行の一意の番号または行の順序としてインデックスが必要な場合は、このインデックス タイプが最適です。ただし、数値には不確定なギャップがあります
テスト:
ps.set_option('compute.default_index_type','distributed')
dfsp = ps.read_csv('df_s.csv')
print(dfsp.to_spark().rdd.getNumPartitions())
output:
8
dfsp.head()
output:
id b
0 0 c
1 1 c
2 2 b
3 3 c
4 4 c
質問: これもsequence
型の動作のみです。生成されるインデックスは、1 から任意の場所までの順序付けられたシーケンスです。不確定なギャップで単調に増加する数値である必要があります。
私が正しく理解していないことと、デフォルトのインデックスの 3 つのタイプすべてで正確に予想される動作は何ですか?