#csv #apache-spark #pyspark #pyspark-dataframes #explain
#csv #apache-spark #pyspark #объясните
Вопрос:
Я читаю CSV-файл с заголовком, но создаю свою пользовательскую схему для чтения. Я хотел понять, есть ли разница, показанная в explain, если я предоставляю схему или нет. Мое любопытство возникло из этого утверждения о read.csv в документе
Загружает CSV-файл и возвращает результат в виде фрейма данных. Эта функция будет проходить через ввод один раз, чтобы определить схему ввода, если включена inferSchema. Чтобы избежать однократного просмотра всех данных, отключите опцию inferSchema или укажите схему явно с помощью schema .
Я мог видеть временную задержку в моем приглашении, когда я предоставляю схему по сравнению с используемой схемой вывода. Но я не вижу никакой разницы в функции explain. Ниже приведен мой код и выходные данные с предоставленной схемой
>> friends_header_df = spark.read.csv(path='resources/fakefriends-header.csv',schema=custom_schems, header='true', sep=',')
>> print(friends_header_df._jdf.queryExecution().toString())
== Parsed Logical Plan ==
Relation[id#8,name#9,age#10,numFriends#11] csv
== Analyzed Logical Plan ==
id: int, name: string, age: int, numFriends: int
Relation[id#8,name#9,age#10,numFriends#11] csv
== Optimized Logical Plan ==
Relation[id#8,name#9,age#10,numFriends#11] csv
== Physical Plan ==
FileScan csv [id#8,name#9,age#10,numFriends#11] Batched: false, DataFilters: [], Format: CSV, Location: InMemoryFileIndex[file:/Users/sgudisa/Desktop/python data analysis workbook/spark-workbook/resour..., PartitionFilters: [], PushedFilters: [], ReadSchema: struct<id:int,name:string,age:int,numFriends:int>
И ниже для чтения с опцией inferSchema
>> friends_noschema_df = spark.read.csv(path='resources/fakefriends-header.csv',header='true',inferSchema='true',sep=',')
>> print(friends_noschema_df._jdf.queryExecution().toString())
== Parsed Logical Plan ==
Relation[userID#32,name#33,age#34,friends#35] csv
== Analyzed Logical Plan ==
userID: int, name: string, age: int, friends: int
Relation[userID#32,name#33,age#34,friends#35] csv
== Optimized Logical Plan ==
Relation[userID#32,name#33,age#34,friends#35] csv
== Physical Plan ==
FileScan csv [userID#32,name#33,age#34,friends#35] Batched: false, DataFilters: [], Format: CSV, Location: InMemoryFileIndex[file:/Users/sgudisa/Desktop/python data analysis workbook/spark-workbook/resour..., PartitionFilters: [], PushedFilters: [], ReadSchema: struct<userID:int,name:string,age:int,friends:int>
За исключением чисел, изменяющихся для столбцов в анализируемом логическом плане, я не вижу никаких объяснений того, что spark считывает все данные один раз.
Ответ №1:
По умолчанию используется параметр inferSchema = false. Вы получите все столбцы в виде строк для DF. Но если вы предоставите схему, вы получите свой результат.
Вывод схемы означает, что Spark запустит дополнительную работу под водой, чтобы сделать именно это; вы можете видеть это на самом деле. Это займет больше времени, но вы не увидите — как вы заявляете — ничего в объясненном плане. Underwater — это «подводный».