Чтение файлов HDFS с использованием метаданных Hive — Pyspark

#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. Команда будет выполняться только тогда, когда требуются данные.