Я пытаюсь прочитать список каталогов каждый в свой собственный фрейм данных. Например.
dir_list = ['dir1', 'dir2', ...]
df1 = spark.read.csv(dir_list[0])
df2 = spark.read.csv(dir_list[1])
...
Каждый каталог содержит данные различных схем.
Я хочу сделать это параллельно, поэтому простой цикл for не сработает. Есть ли способ сделать это?
Но я хочу хранить данные в отдельных кадрах данных, поэтому выполнение spark.read.csv(*dir_list) не сработает (помещает их все в один df).
Что вы подразумеваете под "я хочу сделать это параллельно"? Можете ли вы уточнить, почему вы хотите, чтобы это было параллельно?
Да, есть :))
«Как» будет зависеть от того, какую обработку вы выполняете после чтения, потому что сам по себе spark.read.csv(...) не будет выполняться, пока вы не вызовете действие (из-за ленивых вычислений Spark), и помещение нескольких чтений в цикл for будет работать просто отлично.
Таким образом, если результаты оценки нескольких фреймов данных имеют одинаковую схему, параллелизм может быть просто достигнут путем их UNION-обработки. Например,
df1 = spark.read.csv(dir_list[0])
df2 = spark.read.csv(dir_list[1])
df1.withColumn("dfid",lit("df1")).groupBy("dfid").count()
.union(df2.withColumn("dfid",lit("df1")).groupBy("dfid").count())
.show(truncate=False)
... заставит dir_list[0] и dir_list[1] читаться параллельно.
Если это невозможно, то всегда есть маршрут Spark Scheduling:
Внутри данного приложения Spark (экземпляр SparkContext) несколько параллельные задания могут выполняться одновременно, если они были отправлены из отдельные нити. Под «работой» в этом разделе мы подразумеваем действие Spark. (например, сохранить, собрать) и любые задачи, которые необходимо выполнить для оценки этого действие.
Пожалуйста, обратитесь к сообщению ниже. stackoverflow.com/questions/37257111/…