使用impyla模块,我已经将impala查询的结果下载到pandas数据帧中,完成了分析,现在希望将结果写回到impala上的一个表中,或者至少写到一个hdfs文件中。
但是,我找不到任何关于如何做到这一点的信息,甚至找不到如何ssh到impala shell中并从那里写入表的信息。
我想做的是:
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做了我需要做的任何事情,将这些结果作为表保存回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中实现这一点,或者甚至只是将表保存到hdfs,我会很高兴。我将此作为其他用户的脚本来编写,因此必须在脚本中完成所有这些操作。非常感谢!
发布于 2015-09-03 04:47:23
你会爱上Ibis的!它具有HDFS函数(即put
),并包装了您需要的Impala DML和DDL,以简化此操作。
对于类似的情况,我使用的一般方法是将pandas表保存到CSV,将其HDFS.put
到集群,然后使用该CSV作为数据源创建一个新表。
你不需要Ibis来做这件事,但是如果你已经熟悉pandas (Ibis也是由Wes创建的,他写了pandas),它应该会让你的工作变得更容易,并且对你来说可能是一个很好的工具。
发布于 2015-10-10 04:09:29
我也在尝试做同样的事情,我想出了一种方法,用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中隐式地从string转换为varchar(N),那就太好了。)
https://stackoverflow.com/questions/32338006
复制相似问题