2016-12-10 8 views
0

У меня есть проблема, чтобы рассчитать оценку риска на основе предыдущих строк в Hive по customer_id. Я совершенно новый для scala и улей.Расчет оценки риска на основе предыдущих строк в Hive

, например, вот мой стол Temp1:

customer_id recency_score period_start period_end 
a   4    201501  201512 
a   4    201502  201601 
a   3    201503  201602 
a   3    201504  201603 
a   2    201505  201604 
a   2    201506  201605 
a   2    201507  201606 
a   2    201508  201607 
a   2    201509  201608 
a   2    201510  201609 
a   2    201511  201610 
a   2    201512  201611 
b   4    201501  201512 
b   4    201502  201601 
b   3    201503  201602 
b   3    201504  201603 
b   3    201505  201604 
b   3    201506  201605 
b   4    201507  201606 
b   3    201508  201607 
b   2    201509  201608 
b   3    201510  201609 
b   2    201511  201610 
b   2    201512  201611 

Счет риск должен быть:

  • 0, если recency_score не идет вниз между двумя периодами
  • 1, если recency_score уменьшается между двумя периодами
  • 2, если recency_score опускается между двумя периодами, то остается на том же уровне
  • 3, если recency_score идет вниз между двумя периодами, а затем идет вниз снова

Эта часть довольно легко, и я нашел, как это сделать, но я хотел бы также принять во внимание этот предыдущий результат в следующий ряд, я имею в виду, если risk_score уже на 2 раньше, а recency_score - на новый risk_score, будет 3, и если recency_score останется стабильным, тогда он останется на уровне 2.

Фактически, я не знаю, как сохранить в «памяти» предыдущий risk_score.

Еще одна вещь, количество строк для каждого Customer_ID изменяется (для одного customer_id это может быть 12, для другого это может быть 8, для другого это может быть 3 ...)

Так что я хотел бы что-то вроде этого:

customer_id recency_score period_start period_end risk_score 
a   4    201501  201512  0 
a   4    201502  201601  0 
a   3    201503  201602  1 
a   3    201504  201603  2 
a   2    201505  201604  3 
a   2    201506  201605  3 
a   2    201507  201606  3 
a   2    201508  201607  3 
a   2    201509  201608  3 
a   2    201510  201609  3 
a   2    201511  201610  3 
a   2    201512  201611  3 
b   4    201501  201512  0 
b   4    201502  201601  0 
b   3    201503  201602  1 
b   3    201504  201603  2 
b   3    201505  201604  2 
b   3    201506  201605  2 
b   4    201507  201606  0 
b   3    201508  201607  1 
b   2    201509  201608  3 
b   3    201510  201609  0 
b   2    201511  201610  1 
b   2    201512  201611  2 

Если у вас есть какие-то идеи для меня, я буду благодарен

BR, Софи

ответ

1

Это не полное решение, но это слишком долго т o использовать комментарий, и это может быть полезно. Вы можете использовать window functionlag, чтобы «сохранить» предыдущее состояние. Эта функция сдвигает строки на определенное количество позиций (по умолчанию - одно). Например, это предложение создаст один дополнительный столбец с предыдущим recency_score (вы можете применить ту же логику для хранения «предыдущего» состояния всего, что захотите).

val table_modified = spark.sql("SELECT customer_id, recency_score, period_start, period_end, 
LAG(recency_score) OVER (PARTITION BY customer_id ORDER BY period_start) AS previous 
FROM Temp1") 

Обратите внимание, что вы должны обеспечить порядок (в данном случае, столбец period_start) и группу, в данном случае заказчиком. После добавления столбца вы можете, например, изменить таблицу с предыдущим состоянием (хотя это не является абсолютно необходимым). Это создаст следующую таблицу:

scala> table_modified.createOrReplaceTempView("Temp1") 
scala> table_modified.show(100) 
+-----------+-------------+------------+----------+--------+ 
|customer_id|regency_score|period_start|period_end|previous| 
+-----------+-------------+------------+----------+--------+ 
|   b|   4|  201501| 201512| null| 
|   b|   4|  201502| 201601|  4| 
|   b|   3|  201503| 201602|  4| 
|   b|   3|  201504| 201603|  3| 
|   b|   3|  201505| 201604|  3| 
|   b|   3|  201506| 201605|  3| 
|   b|   4|  201507| 201606|  3| 
|   b|   3|  201508| 201607|  4| 
|   b|   2|  201509| 201608|  3| 
|   b|   3|  201510| 201609|  2| 
|   b|   2|  201511| 201610|  3| 
|   b|   2|  201512| 201611|  2| 
|   a|   4|  201501| 201512| null| 
|   a|   4|  201502| 201601|  4| 
|   a|   3|  201503| 201602|  4| 
|   a|   3|  201504| 201603|  3| 
|   a|   2|  201505| 201604|  3| 
|   a|   2|  201506| 201605|  2| 
|   a|   2|  201507| 201606|  2| 
|   a|   2|  201508| 201607|  2| 
|   a|   2|  201509| 201608|  2| 
|   a|   2|  201510| 201609|  2| 
|   a|   2|  201511| 201610|  2| 
|   a|   2|  201512| 201611|  2| 
+-----------+-------------+------------+----------+--------+ 

После создания вы могли бы применить логику вы хотите ваши строки, потому что каждый из них имеет свой «предыдущий» счет в строке.

Надеюсь, это поможет.