使用python从hive到csv获取列名

rjee0c15  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(578)

我使用hiveserver2钩子从配置单元表中获取结果并加载到csv中。钩子 to_csv 函数有一个参数' output_headers '. 如果设置为true,它将以 tablename.columnname 以及数据和写入csv文件。在csv头中,我只需要列名,并且需要从中去掉tablename tablename.columnname . 我可以重写参数以获取列名吗?有没有其他方法可以使用 HiveServer2Hook ?
我已使用hiveserver2hook连接到配置单元。我也做了钩子 to_csv 功能。我只需要更改使用函数返回的列名的格式。这是钩子的链接。你可以找到 to_csv , get_records 以及 get_results 作用于 HiveServer2Hook .

https://airflow.apache.org/_modules/airflow/hooks/hive_hooks.html

我还尝试为hql运行“descripe tablename”和“show columns from tablename”,但是配置单元钩子 get_records 以及 get_results 由于“descripe”和“show columns”返回的结果不是预期的格式,函数在标题问题上中断。
尝试了以下操作:

1) describe tablename;
2) show columns from tablename;

气流挂钩具有以下功能 get_records 以及 get_results . 当我使用上面的hql语句时,这两个语句都在下面一行中断。

header = next(results_iter)

有没有其他方法来获取列名,写信给 CSV 并使用 HiveServer2Hook 以及 Python ?

hwamh0ep

hwamh0ep1#

使用 HiveMetastoreHookget_table(..) 函数来获取精确的列名,如下所示


# imports

from airflow.hooks.hive_hooks import HiveMetastoreHook
from hmsclient.genthrift.hive_metastore import ttypes
from typing import List

# create hook

hive_metastore_hook: HiveMetastoreHook = HiveMetastoreHook(metastore_conn_id="my-hive-metastore-conn-id")

# fetch table object

table: ttypes.Table = mt_hook.get_table(table_name="my_table_name", db="my_db_name")

# determine column names

column_names: List[str] = [field_schema.name for field_schema in table.sd.cols]

..
在此之后,您必须子类 Hiveserver2Hook 修改 to_csv(..) 方法。特别是改变 header 对客户的价值 column_names 上面提取的就足够了。
或者,如果您不希望子类 Hiveserver2Hook ,你可以实现它的 to_csv(..) 分开(例如在 hive_utils.py 文件)并实现相同的行为

sgtfey8w

sgtfey8w2#

我遇到了同样的问题,下面是我发现的一个更简单的方法。
将下面的配置单元配置文件参数传递给 to_csv(..) 方法

hive_conf={"hive.resultset.use.unique.column.names": "false"}

这将抑制列名之前的表名。

相关问题