我有近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|
+-----+---+-----+----------+
感谢。
答案 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)
最后一步是使用postCount
和index
过滤来过滤所需的数据框
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|
+-----+---+-----+----------+