2

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. 序列类型
  • 数据将在同一个节点上收集(数据框应该只有 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

问题:为什么分区数不是 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只是类型默认索引。

  1. 分散式
  • “分布式”索引几乎没有性能损失,并且总是创建单调递增的数字。如果只需要索引作为每行的唯一编号或行的顺序,则此索引类型将是最佳选择。然而,数字有一个不确定的差距

测试:

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 到任何地方的有序序列。它应该是单调递增的数字,具有不确定的差距。

有人可以帮我澄清一下我没有正确理解的内容,以及所有三种类型的默认索引的确切预期行为是什么?

4

0 回答 0