Вставка Python Dataframe в Hive с внешнего сервера - PullRequest
0 голосов
/ 03 декабря 2018

В настоящее время я использую PyHive (Python3.6) для чтения данных на сервер, который существует за пределами кластера Hive, а затем использую Python для выполнения анализа.

После выполнения анализа я хотел бы записать данные обратно на сервер Hive.В поисках решения большинство сообщений касаются использования PySpark.В долгосрочной перспективе мы настроим нашу систему на использование PySpark.Однако в краткосрочной перспективе существует ли способ легко записывать данные непосредственно в таблицу Hive с использованием Python с сервера за пределами кластера?

Спасибо за вашу помощь!

Ответы [ 4 ]

0 голосов
/ 14 июня 2019

Вы можете написать обратно.Конвертируйте данные df в такой формат, как будто вы вставляете несколько строк в таблицу одновременно, например .. insert into table values (first row of dataframe comma separated ), (second row), (third row) .... и т. Д .;Таким образом, вы можете вставить.

bundle=df.assign(col='('+df[df.col[0]] + ','+df[df.col[1]] +...+df[df.col[n]]+')'+',').col.str.cat(' ')[:-1]

con.cursor().execute('insert into table table_name values'+ bundle)

и все готово.

0 голосов
/ 04 декабря 2018

В каком формате вы хотите записать данные в улей?Паркет / Авро / Бинарный или простой csv / текстовый формат?В зависимости от вашего выбора serde, который вы используете при создании таблицы кустов, различные библиотеки python могут использоваться для того, чтобы сначала преобразовать ваш фрейм данных в соответствующий serde, сохранить файл локально, а затем вы можете использовать что-то вроде save_to_hdfs (как ответил @Jared Wilber ниже) дляпереместите этот файл в путь расположения таблицы кустов hdfs.

Когда создается таблица улья (таблица по умолчанию или внешняя таблица), она считывает / сохраняет свои данные из определенного местоположения HDFS (по умолчанию или предоставленного местоположения).И это местоположение hdfs может быть напрямую доступно для изменения данных.Некоторые вещи, которые следует помнить, если вручную обновлять данные в таблицах кустов - SERDE, PARTITIONS, ROW FORMAT DELIMITED и т. Д.

Некоторые полезные библиотеки serde в python:

0 голосов
/ 22 декабря 2018

Потребовалось некоторое копание, но я смог найти метод, использующий sqlalchemy для создания таблицы кустов непосредственно из фрейма данных pandas.

from sqlalchemy import create_engine

#Input Information
host = 'username@local-host'
port = 10000
schema = 'hive_schema'
table = 'new_table'


#Execution
engine = create_engine(f'hive://{host}:{port}/{schema}')
engine.execute('CREATE TABLE ' + table + ' (col1 col1-type, col2 col2-type)')
Data.to_sql(name=table, con=engine, if_exists='append')
0 голосов
/ 03 декабря 2018

Вы можете использовать модуль subprocess.

Следующая функция будет работать для данных, которые вы уже сохранили локально.Например, если вы сохраните фрейм данных в csv, вы передадите имя csv в save_to_hdfs, и оно выбросит его в hdfs.Я уверен, что есть способ напрямую перебрасывать фрейм данных, но это поможет вам начать.

Вот пример функции для сохранения локального объекта, output, в user/<your_name>/<output_name> в hdfs.

  import os
  from subprocess import PIPE, Popen

  def save_to_hdfs(output):
      """
      Save a file in local scope to hdfs.
      Note, this performs a forced put - any file with the same name will be 
      overwritten.
      """
      hdfs_path = os.path.join(os.sep, 'user', '<your_name>', output)
      put = Popen(["hadoop", "fs", "-put", "-f", output, hdfs_path], stdin=PIPE, bufsize=-1)
      put.communicate()

  # example
  df = pd.DataFrame(...)
  output_file = 'yourdata.csv'
  dataframe.to_csv(output_file)
  save_to_hdfs(output_file)
  # remove locally created file (so it doesn't pollute nodes)
  os.remove(output_file)
...