有没有办法限制在 spark sql 中加入表时读取的数据?

Posted

技术标签:

【中文标题】有没有办法限制在 spark sql 中加入表时读取的数据?【英文标题】:Is there a way to limit the data being read when joining tables in spark sql? 【发布时间】:2020-09-17 08:40:22 【问题描述】:

我想通过连接两个非常大的表来读取 spark sql 中的数据。但我只需要来自结果数据帧的固定数字(比如说 500)。 比如——

SELECT id, name, employee.deptno, deptname
FROM employee INNER JOIN department ON employee.deptno = department.deptno

在这里我可以在结果数据帧上使用 head(500) 或 limit(500) 函数来限制结果数据帧中的行,但它仍然会先从两个表中读取完整数据,然后再在结果数据帧上它将应用限制。 有没有办法在应用限制之前避免读取完整数据?

【问题讨论】:

您可以先使用单独的子查询限制每个表的记录数,然后再加入。 @ShreyJakhmola 但我不一定事先知道输入表。这可能是一个非常复杂的 sql,它连接了我收到的许多表。现在要提取加入的表,我必须提取其中使用的所有表,然后再次在其上创建一个临时表,然后在其上运行查询,这将是复杂的。 限制从查询输出中获取前 n 行。您的评论回答了您的问题。由于您无法限制基础表中的数据,而且您无法知道您需要哪些数据,因此您无法实现您想要做的事情。 是的,没错。我现在只做了这样的事情。先提取单个表,然后先限制单个表上的数据,然后再将它们连接起来。 【参考方案1】:

类似这样的:

employee = spark.sql('select id, name, deptno from employee limit 500')
department = spark.sql('select deptno, deptname from department limit 500')
employee = employee.join(department, on = 'deptno', how = 'inner')

【讨论】:

最后我只做了这个。我想没有其他方法可以做到这一点,除非先从 sql 中提取所有表,然后将它们加入有限的数据中。

以上是关于有没有办法限制在 spark sql 中加入表时读取的数据?的主要内容,如果未能解决你的问题,请参考以下文章

计算连接表时缺少条件

如何在 r2dbc 中加入表?

如何在 Rails 3 中加入表并计算记录?

有没有办法在写入之前告诉在 Azure Data Lake Storage Gen1 中将 Spark Dataframe 保存为增量表时将创建多少个文件?

在 TypeORM 和 NodeJS 中加入表

在 MySQL 中加入表的转置