将 pandas table 写入 impala

Write pandas table to impala

使用 impyla 模块,我已将 impala 查询的结果下载到 pandas 数据框,完成分析,现在想将结果写回 table 在 impala 上,或者至少是一个 hdfs 文件。

但是,我找不到任何关于如何执行此操作的信息,甚至找不到如何通过 ssh 进入 impala shell 并从那里写入 table 的信息。

我想做什么:

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()  

一旦我用 pandas_df 完成了我需要做的任何事情,将这些结果作为 table 保存回 impala。

# 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()

上面的场景是理想的,但如果我能弄清楚如何通过 ssh 进入 impala-shell 并从 python 执行此操作,我会很高兴,甚至只需将 table 保存到 hdfs。我将此作为其他用户的脚本编写,因此必须在脚本中完成所有这些操作。非常感谢!

你会爱上 Ibis!它具有 HDFS 功能(即 put)并包装了 Impala DML 和 DDL,您需要使这变得简单。

我用于类似操作的一般方法是将您的 pandas table 保存到 CSV,HDFS.put 保存到集群,然后创建一个新的 table 使用该 CSV 作为数据源。

你不需要 Ibis,但它应该会让它更容易一些,如果你已经熟悉 pandas(Ibis也是Wes创造的,他写了pandas)。

我正在尝试做同样的事情,我想出了一种方法,通过 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”)

这工作正常,impala(后端 mysql)中的 table 工作正常。

但是,当 impala 尝试对列进行分析时,我无法获取文本值,但我遇到了转换错误。 (如果可能的话,在 impyla 中从字符串隐式转换为 [var]char(N) 会非常好。)