有没有办法限制在 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 中加入表时读取的数据?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在写入之前告诉在 Azure Data Lake Storage Gen1 中将 Spark Dataframe 保存为增量表时将创建多少个文件?