在同一会话上从 pyspark 运行多个配置单元查询

Posted

技术标签:

【中文标题】在同一会话上从 pyspark 运行多个配置单元查询【英文标题】:Run multiple hive query from pyspark on the same session 【发布时间】:2019-10-01 11:57:11 【问题描述】:

我正在尝试使用 pyspark 运行 Hive 查询。我正在使用 Hortonworks,所以我需要使用 Hive WarehouseConnector。

运行一个甚至多个查询既简单又有效。我的问题是我想在之前发出set 命令。例如在 tez ui 中设置 dag 名称:set hive.query.name=something relevant 或设置一些内存配置set hive.tez.container.size = 8192。要使这些语句生效,它们需要在与主查询相同的会话上运行,这是我的问题。

我尝试了两种方法:

第一个是为每个查询生成一个新的 hive 会话,并带有正确设置的 url,例如:

url='jdbc:hive2://hiveserver:10000/default?hive.query.name=relevant'
builder = HiveWarehouseSession.session(self.spark)
builder.hs2url(url)
hive = builder.build()
hive.execute("select * from whatever")

第一个查询效果很好,但是下一个查询会重复使用相同的 url(即使我尝试手动删除 builderhive),所以不起作用。

第二种方法是在spark thrift服务器中全局设置spark.sql.hive.thriftServer.singleSession=true。这似乎确实有效,但我发现只为一个应用程序的利益而限制全局 spark thrift 服务器是一种耻辱。

有没有办法实现我正在寻找的东西?也许有一种方法可以将查询固定到一个执行者,所以希望是一个会话?

【问题讨论】:

【参考方案1】:

这一直是我的一个大问题......实际上仍然是。

为我解决此问题的解决方案是将所有查询放在一个查询文件中,其中每个查询都用分号分隔。然后我在 python 脚本中使用直线运行查询。

不幸的是,它不适用于返回结果的查询...仅适用于设置、覆盖、插入类型的查询。

如果您发现了更有效的方法,请分享。

【讨论】:

以上是关于在同一会话上从 pyspark 运行多个配置单元查询的主要内容,如果未能解决你的问题,请参考以下文章

通过 pyspark 数据框创建配置单元管理的分区表并为每个运行附加数据

在pyspark中按时间差将行拆分为多个会话

有条件地在其他列上从配置单元表中获取最新列值

在同一个 Spark 会话中运行多个 Spark Kafka 结构化流查询会增加偏移量但显示 numInputRows 0

如何在同一台服务器上跨多个域维护 PHP 会话?

pyspark:在同一列(使用数组)上使用多个 UDF 函数时出现意外行为