我可以使用另一个数据框列来查询 spark sql

Posted

技术标签:

【中文标题】我可以使用另一个数据框列来查询 spark sql【英文标题】:Can I use another dataframe column to query spark sql 【发布时间】:2016-05-17 04:50:02 【问题描述】:

我在 Hive 中有两张大桌子。 “表 1”和“表 2”。两个表都有一个共同的列'key'。

我已经用所需条件查询了“表 1”并创建了一个数据帧“df1”。 现在,我想查询“表 2”,并想在 where 子句中使用“df1”中的一列。

这是代码示例:

val df1 = hiveContext.sql("select * from table1 limit 100")

我可以做类似的事情

val df2 = hiveContext.sql("select * from table2 where key = df1.key")

** 注意:我不想通过连接两个表来进行单个查询

任何帮助将不胜感激。

【问题讨论】:

你要求的是加入 :) 【参考方案1】:

由于您已经明确写过您不想加入这些表,因此简短的回答是“不,您不能进行这样的查询”。

我不确定您为什么不想进行连接,但如果您想进行查询,肯定需要它。如果您担心加入两个“巨大的桌子”,那就不要担心。 Spark 就是为这种事情而构建的 :)

【讨论】:

感谢您的回答。我使用 Spark 已经一年多了。我尝试加入,但它导致了需要很长时间才能完成的工作中的 200 万 + 任务。这就是为什么我想要一种没有连接和查找的方法,因为可以控制第一个 df 的计数。 此外,我尝试重新分区,但我使用的是 1.5,您无法在 1.6 中引入的列上重新分区。我想我必须使用 1.6 并在连接键上重新分区,然后检查如何加入需要很多时间 我已经对两个 df (1000) 进行了分区,所以新作业有 100 万个任务...我让代码在一夜之间运行,我刚刚检查,7 小时内完成了 34 个任务,有正在处理 84 TB 的数据。这就是我不想读取整个数据集然后加入的原因。 我认为如果您拥有 84TB 的数据,那么 1000 个分区并不算多。还有你的集群有多大,你在什么机器实例上运行?您是只加入还是尝试做其他事情(例如分组或模拟)?你的启动命令是什么样的? 如果引用表很小,那么它应该被表示为一个没有洗牌的广播连接【参考方案2】:

我找到的解决方案如下

让我先给出数据集的大小。

Dataset1 - pretty small (10 GB)
Dataset2 - big (500 GB+)

数据框连接有两种解决方案

解决方案 1 如果您使用的是 Spark 1.6+,请按重新分区两个数据帧 必须在其上进行连接的列。当我这样做时,加入就完成了 不到 2 分钟。

df.repartition(df("key"))

解决方案 2 如果你没有使用 Spark 1.6+(即使使用 1.6+),如果一个 数据很小,缓存它并在广播中使用它

df_small.cache
df_big.join(broadcast(df_small) , "key"))

不到一分钟就完成了。

【讨论】:

以上是关于我可以使用另一个数据框列来查询 spark sql的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据块中使用 Spark sql 连接 Spark 数据框列

将一个数据框列值传递给另一个数据框过滤条件表达式 + Spark 1.5

Pyspark 通过使用另一列中的值替换 Spark 数据框列中的字符串

在 Python/PySpark 中 Spark 复制数据框列的最佳实践?

Spark SQL - “包含”功能的替代方案

在 spark python 中重命名数据框列