Spark2.3 - SQL获取字符串之前和之后的记录

时间:2018-05-14 11:43:29

标签: sql apache-spark pyspark apache-spark-sql

我有近200万条记录,需要根据搜索文本条件获取2000条记录。

例如: 如果搜索文本为“错误”,则应返回“错误”发生前的1000条记录和“错误”文本发生后的1000条记录,总共2000条记录。

请建议最清晰有效的解决方案。

我有以下数据框:

+-----+---+-----+----------+
|index|  X|label|      date|
+-----+---+-----+----------+
|    1|  1|    A|2017-01-01|
|    2|  3|    B|2017-01-02|
|    3|  5|    C|2017-01-03|
|    4|  7|    D|2017-01-04|
|    5|  7|    E|2017-01-04|
|    6|  7|    F|2017-01-04|
|    7|  7|    G|2017-01-04|
|    8|  7|    H|2017-01-04|
|    9|  7|    I|2017-01-04|
|   10|  7|    J|2017-01-04|
+-----+---+-----+----------+

如果输入搜索文本(标签列)为“F”且前后计数为2

所需的输出:

+-----+---+-----+----------+
|index|  X|label|      date|
+-----+---+-----+----------+
|    4|  7|    D|2017-01-04|
|    4|  7|    E|2017-01-04|
|    4|  7|    F|2017-01-04|
|    4|  7|    G|2017-01-04|
|    4|  7|    H|2017-01-04|
+-----+---+-----+----------+

感谢。

2 个答案:

答案 0 :(得分:1)

SELECT *
FROM mytable
CROSS JOIN
  (SELECT index AS index_of_matched_search
   FROM mytable
   WHERE label='F')
WHERE abs(index - index_of_matched_search) <= 1000

答案 1 :(得分:1)

正如问题中所解释的那样,您可以将搜索文本发布计数视为

val searchText = "F"
val postCount = 2

然后使用searchText函数中的filter,您可以获取searchText匹配的行的索引

import org.apache.spark.sql.functions._
val index = df.filter(col("label") === searchText).select("index").first().getAs[Int](0)

最后一步是使用postCountindex过滤来过滤所需的数据框

val resultDF = df.filter(col("index") >= (index - postCount)  && col("index") <= (index + postCount))

应该给你

+-----+---+-----+----------+
|index|X  |label|date      |
+-----+---+-----+----------+
|4    |7  |D    |2017-01-04|
|5    |7  |E    |2017-01-04|
|6    |7  |F    |2017-01-04|
|7    |7  |G    |2017-01-04|
|8    |7  |H    |2017-01-04|
+-----+---+-----+----------+