Запрос SparkSql, чтобы получить только предыдущую и следующую строку из Кассандры для определенного значения - PullRequest
0 голосов
/ 28 апреля 2018

Мы должны написать запрос SparkSQL, чтобы получить только предыдущую и следующую строку определенного значения. Допустим, наша структура таблицы в Кассандре выглядит следующим образом

id, timestamp
1, 100
2,200
3,300
4,400

Теперь мне нужно написать Spark Query, чтобы получить только две строки, и из этих двух строк значение первой строки должно быть меньше 300, что составляет (2200), а значение второй строки должно быть больше 300, что составляет (4400 ). И я не хочу выполнять заказ по операции из-за большого объема данных. В случае большого объема данных порядок операций будет медленным. Мы можем понять это требование следующим образом. Предположим, я хочу, чтобы два получили только предыдущую и следующую строку из таблицы со значением метки времени: Для первого ряда: должно быть меньше 300, поэтому ожидаемый ряд (2, 200) Для второго ряда: должно быть больше 300, поэтому ожидаемый ряд (4, 400) И вывод должен быть как ниже

2,200
4,400

Но это должно быть выполнено без заказа по операции.

1 Ответ

0 голосов
/ 28 апреля 2018

Вы можете использовать RDD API, создав индексный столбец, смещенный вверх или вниз для имитации операции скольжения:

#Obtain an index for each element
df_id = df.rdd.zipWithIndex()\
         .map(lambda row: Row(id=row[0].id, timestamp=row[0].timestamp, idx=row[1]))\
         .toDF()
previousDF = df_id.rdd\
          .map(lambda row: Row(previous_id=row.id, previous_timestamp=row.timestamp, idx=row.idx+1))\
          .toDF()
nextDF = df_id.rdd\
          .map(lambda row: Row(next_id=row.id, next_timestamp=row.timestamp, idx=row.idx-1))\
          .toDF()

Теперь выполните объединение в столбце idx, чтобы объединить исходный DF с другими:

df_id.join(previousDF, on='idx')\
     .join(nextDF, on='idx')\
     .show()

Результат выглядит так:

+---+---+---------+-----------+------------------+-------+--------------+
|idx| id|timestamp|previous_id|previous_timestamp|next_id|next_timestamp|
+---+---+---------+-----------+------------------+-------+--------------+
|  1|  2|      200|          1|               100|      3|           300|
|  2|  3|      300|          2|               200|      4|           400|
+---+---+---------+-----------+------------------+-------+--------------+

Внутреннее объединение всех этих DF приводит к некоторым пропущенным записям на «предыдущей» и «следующей» сторонах. Но вы можете выполнить одно за другим объединение, если хотите посмотреть только предыдущие или следующие записи.

...