将 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) 会非常好。)
使用 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) 会非常好。)