2015-09-01 22 views
5

Używając modułu impyla, pobrałem wyniki zapytania impala do pandasowej ramki danych, wykonałem analizę i chciałbym teraz zapisać wyniki z powrotem do tabeli na impala, lub przynajmniej plik hdfs.Napisz tabelę pand do impala

Jednak nie mogę znaleźć żadnych informacji, jak to zrobić, ani nawet jak ssh wrzucić do powłoki impala i napisać stamtąd.

Co chciałbym zrobić:

from impala.dbapi import connect 
from impala.util import as_pandas 

# connect to my host and port 
conn=connect(host='myhost', port=111) 

# create query to save table as pandas df 
create_query = """ 
    SELECT * FROM {} 
    """.format(my_table_name) 

# run query on impala 
cur = conn.cursor() 
cur.execute(create_query) 

# store results as pandas data frame 
pandas_df = as_pandas(cur) 
cur.close() 

Raz zrobiłem co trzeba zrobić z pandas_df zapisać te wyniki z powrotem do impala jak stół.

# create query to save new_df back to impala 
save_query = """ 
    CREATE TABLE new_table AS 
     SELECT * 
     FROM pandas_df 
    """ 

# run query on impala 
cur = conn.cursor() 
cur.execute(save_query) 
cur.close() 

Powyższy scenariusz byłby idealny, ale byłbym szczęśliwy, gdybym mógł dowiedzieć się, jak ssh do impala-shell i zrobić to z pytona, albo nawet po prostu zapisać tabelę do HDFS. Piszę to jako skrypt dla innych użytkowników, więc ważne jest, aby wszystko zostało wykonane w skrypcie. Dzięki wielkie!

Odpowiedz

3

Będziesz kochać Ibis! Ma funkcje HDFS (put, a mianowicie) i opakowuje Impala DML i DDL, aby to ułatwić.

Podejście ogólne, którego użyłem do czegoś podobnego, to zapisanie tabeli pandy do pliku CSV, HDFS.put, która jest w klastrze, a następnie utworzenie nowej tabeli przy użyciu tego pliku CSV jako źródła danych.

Nie musisz potrzebujesz Ibis, ale powinno to być trochę łatwiejsze i może być dobrym narzędziem dla Ciebie, jeśli już znasz pandy (Ibis został również stworzony przez Wesa, który napisał pandy).

+0

Tak naprawdę właśnie czytałem o Ibisie innego dnia. Wygląda na to, że muszę to sprawdzić. – SummerEla

1

staram się robić to samo i ja wymyśliliśmy sposób, aby to zrobić na przykładzie wyposażonego impyla:

df = pd.DataFrame(np.reshape(range(16), (4, 4)), columns=['a', 'b', 'c', 'd']) 
df.to_sql(name=”test_df”, con=conn, flavor=”mysql”) 

To działa prawidłowo i stolik w impala (backend MySQL) działa poprawnie.

Jednak utknąłem na otrzymywaniu wartości tekstowych, ponieważ impala próbuje wykonać analizę kolumn i otrzymuję błędy rzutowania. (Byłoby naprawdę fajnie, jeśli to możliwe, aby niejawnie rzucać ze sznurka na [var] char (N) w impyla.)