Spark2.3 - извлечение SQL до и более поздних записей строки - PullRequest
0 голосов
/ 14 мая 2018

У меня около 2 миллионов записей, мне нужно получить 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 голосов
/ 14 мая 2018

Как объяснено в вопросе, допустим, у вас есть текст для поиска и количество сообщений как

val searchText = "F"
val postCount = 2

Затем, используя функцию searchText in 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|
+-----+---+-----+----------+
0 голосов
/ 14 мая 2018
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
...