Используйте PANDAS вместо Spark - PullRequest
1 голос
/ 20 октября 2019

Справочная информация. Я использую ноутбук Zeppelin для аналитики. Цель состоит в том, чтобы использовать Pandas Dataframes вместо использования pySpark dataframe. Панды имеют некоторые статистические функции, которые я использовал. записал .py файл для проверки с файлом образца данных всех расчетов и т. д.

Вариант использования: Мои файлы данных (в формате CSV) содержат данные моделирования. Обычно количество столбцов составляет 45 000. В настоящее время я заинтересован в чтении первых 20000 столбцов. Количество строк обычно 200.

print('1 : ' , datetime.now())
sparkDF=spark.read.csv(filePath + '/' + filename,header=True,maxColumns=50000)
print('Built sparkDF with Rows: ' , sparkDF.count() , ' Column Count: ' , len(sparkDF.columns))
print('2 : ' , datetime.now())
sparkDF1 = sparkDF.select(sparkDF.columns[0:20000])
print('Built sparkDF1 with Rows: ' , sparkDF1.count() , ' Column Count: ' , len(sparkDF1.columns))
print('3 : ' , datetime.now())
exposures = sparkDF1.toPandas()
print('Built exposures with Rows: ' , exposures.shape[0] , ' Column Count: ' , exposures.shape[1])
print('4 : ' , datetime.now())

1 :  2019-10-17 16:34:06.725326
Built sparkDF with Rows:  107  Column Count:  40002
2 :  2019-10-17 16:40:04.171931
Built sparkDF1 with Rows:  107  Column Count:  20001
3 :  2019-10-17 16:51:12.465739
Built exposures with Rows:  107  Column Count:  20001
4 :  2019-10-17 16:58:25.65423

Проблемы:

  1. Панды не могут читать файлы данных, которые находятся на HDFS.
  2. Чтобы обойти проблему, я использовалСпарк, чтобы прочитать файл, а затем преобразован в панд.

Время для создания кадров данных значительно выше.

Мне нужно обработать 2900 таких файлов. Нужны некоторые рекомендации и альтернативы.

1 Ответ

2 голосов
/ 20 октября 2019

Я вижу, вы читаете несколько файлов из пути к файлу. Чтобы оптимизировать этот процесс, вы можете читать весь каталог .csv файлов, а не читать по одному файлу за один раз ( при условии, что ваша схема одинакова для всех файлов, что выглядит так, как у вас ):

file_path = "hdfs://path/to/multiple/files/"

df = (
        spark.read.format("com.databricks.spark.csv")
            .options(header="true", inferSchema="true")
            .load(file_path)
    )
pdf = df.toPandas()

Это оптимизирует ваш ввод-вывод на некоторое количество. Даже если у вас есть 10 или 200 файлов или 2900 файлов в одной и той же папке, скорость чтения будет выше, чем при индивидуальном чтении одного файла.

Примечание : вышеуказанное решение не будет работать для вложенных папок.

...