【发布时间】:2019-12-09 19:13:14
【问题描述】:
我有一个来自生产线的过程数据的大表,其中包含产品在 Hadoop 数据湖中创建过程中所经历的许多步骤。在某些时候,我很想知道在某个过程发生前 N 步发生了什么。
我可以编写一个选择查询,它返回与我可以识别的进程相对应的行,但是我如何(并且应该)在满足我的实际选择查询的行之前返回 N 行?
我想知道是否可以在 SQL/pyspark 中做这样的事情,我是否应该这样做,或者在选择包含我想要的信息的更大数据集后,是否应该在 python 中做这样的事情并使用 python 过滤掉我需要的位。
示例表结构:
|Col 1 | Col 2 | Col 3| Col 4 |
|A | 1 | One | Date 1 |
|C | 1 | Two | Date 2 |
|B | 1 | One | Date 1 |
|C | 2 | Two | Date 2 |
|C | 1 | Three| Date 3 |
|D | 2 | Four | Date 1 |
|E | 1 | Five | Date 5 |
SELECT * FROM Table1
WHERE COL 1 = "C" and COL 3 = "Three"
ORDER BY COL 4, Col 2
会返回什么
|Col 1 | Col 2 | Col 3| Col 4 |
|C | 1 | Three| Date 3 |
我想退货
|Col 1 | Col 2 | Col 3| Col 4 |
|C | 1 | One | Date 2 |
|C | 2 | Two | Date 2 |
|C | 1 | Three| Date 3 |
高于 N=2,但 N 应该是可变的。如果可以在 SQL 中实现,我真的很感兴趣,这是否应该在 SQL 中完成,或者是否最好在代码中完成。我可以看到双方的争论,但需要一些外部意见。
编辑:两种建议的方法似乎都依赖于我之前提供的结构,其中 Col 2 是一个递增的值。这是误导,因为我使用 Col 2 和数字作为虚拟值。我现在已经用两列更新了表格,它们实际上显示了表格是如何正确排序的。首先是包含日期时间戳的列,其次是包含整数的列。
该表是 Hadoop 数据湖中的一个表,因此建议的解决方案应提供可以在该环境中执行的 SQL。
编辑 2:很明显,行本身可能不一定是连续的,所以我不想要最后 N 行,而是希望最后 N 行也满足某个谓词。在上面的示例中,谓词是 where Col2 = "C"。
【问题讨论】:
-
您的意思是 COL 3 = "Three" 我相信,因为您的 Col2 是数字。
-
你是 100% 正确的
-
嗨,关于 pyspark 解决方案 - 是的,它的性能肯定会更好,但它也需要更多的工作。你有什么准备吗?像火花上下文定义,或者至少连接到 SQL 数据库?如果是让您从头开始使用 pyspark,则不值得使用 SQL,除非作为学习练习。
-
pyspark 和连接一切都设置好了。这是一项富有成效的任务,再加上学习练习。 Apache spark 或 pyspark 上的 SQL 与 spark 上下文很好,处理提取的数据也很好,它更多地是关于如何以最佳方式提取数据以及我的努力最好花在这方面的教育上。
标签: sql hadoop pyspark-sql