#python #dataframe #pyspark #apache-spark-sql #pyspark-sql
#python #фрейм данных #pyspark #apache-spark-sql
Вопрос:
Я новичок в PySpark и пытаюсь прочитать файлы HDFS (поверх которых созданы таблицы hive) и создать фреймы данных PySpark. Чтение таблиц Hive через PySpark отнимает много времени. Есть ли какие-либо способы, которыми я могу динамически получать имена столбцов улья (для использования в качестве схемы в dataframe)?
Я хочу передать местоположение файла, имя таблицы и имя базы данных в качестве входных данных программе / функции aa, чтобы получить имя схемы / столбца из метаданных hive (возможно, метаданных xml) и вернуть как dataframe.
Пожалуйста, посоветуйте
Ответ №1:
Вы можете получить список имен столбцов, вызвав dataframe.column
df1 = spark.sql('select * from bla')
df1.columns
['col1', 'col2']
Метод printschema поможет вам в случае, если вам понадобятся типы столбцов
df1.printSchema()
root
|-- col1: long (nullable = true)
|-- col2: long (nullable = true)
Оба метода не считывают никаких данных из таблиц, кроме схемы. Еще одна вещь, которую вы могли бы попробовать, когда пытаетесь повысить производительность, — это сохранение таблиц в формате parquet. Вы можете сделать это с помощью следующей команды:
df1.write.mode("overwrite").saveAsTable("blaASParquet")
Parquet — это хранилище на основе столбцов, и это полезно для большинства методов агрегирования.
Комментарии:
1. Спасибо cronoik… Не будет ли этот шаг «df1 = spark.sql(‘select * from bla’)» обращаться к полному набору данных и пытаться загрузить его в df1? Это самый быстрый способ получить схему таблицы hive? Пожалуйста, посоветуйте.
2. Нет, этого не будет. Пока вы ничего не делаете с данными, например, преобразование или агрегирование, эта команда ничего не сделает, кроме создания переменной с именем df1. Команда будет выполняться только тогда, когда требуются данные.