Конфликт PySpark Уровень хранилища по умолчанию? - PullRequest
1 голос
/ 08 июля 2019

Смущен, почему кэшированные DF (в частности, 1-й) показывают разные Storage Levels здесь в интерфейсе Spark, основанные на фрагментах кода

enter image description here

print(spark.version)
2.4.3

# id 3 => using default storage level for df (memory_and_disk) and unsure why storage level is not serialized since i am using pyspark
df = spark.range(10)
print(type(df))
df.cache().count()
print(df.storageLevel)

# id 15 => using default storage level for rdd (memory_only) and makes sense why it is serialized
rdd = df.rdd
print(type(rdd))
rdd.cache().collect()

# id 19 => manually configuring to (memory_and_disk) which makes the storage level serialized
df2 = spark.range(100)
from pyspark import StorageLevel
print(type(df2))
df2.persist(StorageLevel.MEMORY_AND_DISK).count()
print(df2.storageLevel)

<class 'pyspark.sql.dataframe.DataFrame'>
Disk Memory Deserialized 1x Replicated
<class 'pyspark.rdd.RDD'>
<class 'pyspark.sql.dataframe.DataFrame'>
Disk Memory Serialized 1x Replicated

Согласно сохраненной документации Spark python объекты всегда serialized, так почему первый df показывает deserialized?

https://spark.apache.org/docs/latest/rdd-programming-guide.html#which-storage-level-to-choose

Примечание. В Python сохраненные объекты всегда будут сериализованы с помощью библиотеки Pickle, поэтому не имеет значения, выбираете ли вы сериализованный уровень. Доступные уровни хранения в Python включают MEMORY_ONLY, MEMORY_ONLY_2, MEMORY_AND_DISK, MEMORY_AND_DISK_2, DISK_ONLY и DISK_ONLY_2.

По умолчанию хранилище для rdd равно MEMORY_ONLY, а для df оно равно MEMORY_AND_DISK, поэтому разве пользовательский интерфейс Spark не должен отображать serialized для всех pyspark кэшированных фреймов данных?

1 Ответ

0 голосов
/ 08 июля 2019

Обнаружил забавную вещь (возможно, это ошибка), Фокус на вашей версии spark 2.4.3

В pyspark, когда мы вызываем cache () , он вызывает функцию кэширования Java() только

И внутри Scala API он будет кэшироваться с MEMORY_AND_DISK, а затем он определяется в StorageLevel как create(true, true, false, true, 1);, а второй true означает десериализацию.

В заключение, когда вы вызываете cache () в pyspark, он всегда будет создавать десериализованный объект в памяти и на диске.Это неправильное поведение с pyspark, поскольку в документе упоминается, что его всегда следует сериализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...